سؤال

حسنا, هذا النوع من يلي من سؤالي السابق.

ما أود القيام به هو خلق نوع من السمة التي تسمح لي لتزيين الطريقة التي سوف كسر بناء.مثل الكثير من عفا عليها الزمن("السبب", true) السمة ، ولكن دون زورا تحديد عفا عليها الزمن رمز.

لتوضيح:أنا لا أريد أن كسر بناء على أي F6 (بناء) الصحافة ، أنا فقط أريد أن كسر بناء إذا كان الأسلوب مزينة السمة يسمى في مكان آخر في التعليمات البرمجية.كما قلت ، مماثلة عفا عليها الزمن ، ولكن ليس نفس الشيء.

وأنا أعلم أنني لست وحيدا في هذا ، منذ المستخدمين الآخرين ترغب في استخدامه لأسباب أخرى.لم خلق سمات مخصصة من قبل لذلك هو كل شيء جديد بالنسبة لي!

هل كانت مفيدة؟

المحلول

إذا كان هذا هو التسلسل XML و NHibernate, حيث تريد parameterless منشئ لتكون في متناول (كما هو الحال في على سبيل المثال يمكنك الرجوع إليها) ، ثم استخدام خاصة أو محمية parameterless منشئ التسلسل أو المحمية منشئ NHibernate.مع نسخة محمية, يمكنك فتح نفسك تصل إلى ورثت الطبقات القدرة على استدعاء هذا الرمز.

إذا كنت لا تريد رمز استدعاء أسلوب, لا تجعل من الوصول إليها.

تحرير:ربما الإجابة على السؤال الأعمق, AFAIK المترجم لا يعرف إلا عن ثلاث سمات: عفا عليها الزمن ، الشرطي ، AttributeUsage.إضافة إلى معالجة خاصة عن سمات أخرى يتطلب تعديل مترجم.

نصائح أخرى

وأعتقد أن هذا سيكون ميزة ممتازة طلب Microsoft:إنشاء قاعدة مجردة سمة الفئة CompilerExecutedAttribute أن المترجم العمليات في بعض بطريقة أو التي يمكن أن تؤثر على عملية تجميع.ثم يمكن أن ترث من هذه السمة وتنفيذ العمليات المختلفة مثلتنبعث منها خطأ أو تحذير.

إذا كنت تنظر تحذير (وهو ما [قديمة] تبرزها) بناء-كسر, ثم مجرد استخدام #تحذير مترجم التوجيه.

تحرير:انا لم استخدمه ولكن #خطأ هو متاح أيضا.

إلا دليل على كذبة طريقة توسيع Visual Studio (من خلال بسب) والاشتراك في الصحيح الحدث (ربما في EnvDTE.BuildEvents) صف التحقق من التعليمات البرمجية لاستخدام منشئ ، وإلغاء بناء إذا كنت الكشف عن ذلك.

كل هذا يبدو قليلا مثل يوم أمس TDWTF. :-)

يجب أن نتفق مع جريج:تشكل سمة من أجل ذلك.

و إذا كنت جادا حقا, ربما تجد طريقة لمعرفة إذا كان منشئ يتم الوصول إليها من قبل أي شيء آخر من XMLSerializer و رمي استثناء إذا كان.

أود أن أقترح عليك استخدام #خطأ التوجيه.

آخر مجهولا السمة التي قد تفعل العمل الشرطي السمة (اعتمادا على ما كنت تحاول ahieve)

[Conditional("CONDITION")] 
public static void MiMethod(int a, string msg)

والتي سوف إزالة استدعاء الأسلوب من IL القانون نفسه إذا "MY_CONDITION" يعرف.

إنشاء التقدم القاعدة ، إضافة التقدم إلى تكامل بناء من أجل التحقق من هذا.

سوف تحصل على التحذيرات بدلا من الفشل في بناء.سمات 'تشغيل' في الوقت التفكير بدلا من بناء المرة.

بدلا من ذلك (و هذا هو بالأحرى سيئة) وضع مترجم توجيهات حول طريقة كنت لا تريد أن يسمى.ثم رمز كسر إذا كنت اسميها ، ولكن يمكنك بناء الذي يمر من حق المترجم أن التوجيه لا.

رمي استثناء مخصصة وحدة الاختبار لأنها وظيفة بناء خطوة

وردا 4 سنوات :)

كان لدي نفس السؤال إذا كان هناك بديل عفا عليها الزمن.

على ما أذكر (channel9 الفيديو) قبل قليل وذكرت مايكروسوفت أنها تعمل على إعطاء المشروعات الإنمائية الوصول إلى ما يشبه المحول البرمجي api في بعض نقطة في المستقبل فمن الممكن أن كنت يمكن أن يكتب مترجم "المساعد" التي من شأنها أن تسمح لتزيين الطرق الخاصة بك مع سمة مخصصة ونقول مترجم إلى إلغاء إذا كان يبدو مثل مزينة رمز يمكن أن يكون الحصول على بعض مكان آخر في المدونة وغيرها.

التي من شأنها أن تكون في الواقع بارد جدا عندما كنت تفكر في ذلك.كما يذكرني بأنني يجب أيضا محاولة قراءة في التقدم من أن المحول البرمجي api شيء MS يعمل على ...

لماذا لا تجعل شيئا ما ؟ غير معروف السمة بالتأكيد كسر بناء.

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top