पर विचार करें इस परिदृश्य:क्या कस्टम विशेषता वर्ग "विरासत" विशेषता उपयोग ध्वज का उत्तराधिकारी है?
- एक आधार विशेषता वर्ग
BaseAttribute
एकAttributeUsageAttribute
को निर्दिष्ट है कि यह दाय नहीं है (Inherited = False
) है। - उस व्युत्पन्न विशेषता वर्ग
DerivedAttribute
उस बेस विशेषता वर्ग से विरासत प्राप्त करता है। - एक बेस डोमेन क्लास
Base
व्युत्पन्न विशेषता लागू है। - बेस डोमेन क्लास से विरासत में एक डोमेन क्लास
Derived
विरासत विशेषताओं (inherit: true
) सहित कस्टम विशेषताओं के लिए पूछा जाता है।using System; using System.Linq; namespace ConsoleApplication26 { class Program { static void Main() { var attributes = typeof (Derived).GetCustomAttributes (true); foreach (var attribute in attributes) { Console.WriteLine ( "{0}: Inherited = {1}", attribute.GetType().Name, attribute.GetType().GetCustomAttributes (typeof (AttributeUsageAttribute), true).Cast<AttributeUsageAttribute>().Single().Inherited); } } } [AttributeUsage (AttributeTargets.All, Inherited = false)] public class BaseAttribute : Attribute { } public class DerivedAttribute : BaseAttribute { } [Derived] public class Base { } public class Derived : Base { } }
इस परिदृश्य में,
GetCustomAttributes
एपीआईDerivedAttribute
वर्ग का एक उदाहरण प्रस्तुत करती है:
यहाँ इसी कोड है। मैं उम्मीद करता था कि यह उस उदाहरण को वापस न करें क्योंकि http://msdn.microsoft.com/en-us/library/system.attributeusageattribute.aspx कहता है कि AttributeUsageAttribute
स्वयं विरासत में है।
अब, क्या यह एक बग है, या यह कहीं उम्मीद/दस्तावेज होने की उम्मीद है?
नोट (2013-02-20): प्रयोगों चलता है कि BaseAttribute
वर्ग के AttributeTargets
हिस्सा वास्तव में DerivedAttribute
वर्ग द्वारा विरासत में मिली है। उदा।, जब मैं BaseAttribute
से AttributeTargets.Method
पर अनुमत लक्ष्यों को बदलता हूं, तो सी # कंपाइलर मुझे कक्षा में DerivedAttribute
लागू करने की अनुमति नहीं देगा। इसलिए, यह समझ में नहीं आता है कि Inherited = false
भाग DerivedAttribute
द्वारा विरासत में नहीं मिला है, और इस प्रकार मैं GetCustomAttributes
के कार्यान्वयन में एक बग के बारे में सोचने के इच्छुक हूं।
सुनिश्चित नहीं है कि मुझे समस्या दिखाई दे रही है। यदि आप विशेषता नहीं देखना चाहते हैं तो आपको GetCustomAttributes() विधि में * झूठा * पास करना होगा। –
हां, मुझे पता है कि मैं सिर्फ 'झूठा' पास कर सकता हूं। हालांकि, मैं समझने की कोशिश कर रहा हूं कि 'सत्य' को पार करते समय मुझे साजिश क्यों मिल रही है, भले ही 'व्युत्पन्न' वर्ग को विशेषता का उत्तराधिकारी न हो। मैं दस्तावेज के कुछ टुकड़े या विनिर्देश को इंगित करना चाहता हूं जो मैं देख रहा हूं। –
ऐसा प्रतीत होता है कि AttributeUsageAttribute विरासत ध्वज विरासत में नहीं मिला है, हालांकि कोई इसे एट्रिब्यूट यूजएट्रिब्यूट के रूप में सजाएगा [AttributeUsage (AttributeTargets.Class, Inherited = true)] के साथ सजाया गया है। –