2013-02-19 12 views
6

पर विचार करें इस परिदृश्य:क्या कस्टम विशेषता वर्ग "विरासत" विशेषता उपयोग ध्वज का उत्तराधिकारी है?

  • एक आधार विशेषता वर्ग 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 के कार्यान्वयन में एक बग के बारे में सोचने के इच्छुक हूं।

+0

सुनिश्चित नहीं है कि मुझे समस्या दिखाई दे रही है। यदि आप विशेषता नहीं देखना चाहते हैं तो आपको GetCustomAttributes() विधि में * झूठा * पास करना होगा। –

+0

हां, मुझे पता है कि मैं सिर्फ 'झूठा' पास कर सकता हूं। हालांकि, मैं समझने की कोशिश कर रहा हूं कि 'सत्य' को पार करते समय मुझे साजिश क्यों मिल रही है, भले ही 'व्युत्पन्न' वर्ग को विशेषता का उत्तराधिकारी न हो। मैं दस्तावेज के कुछ टुकड़े या विनिर्देश को इंगित करना चाहता हूं जो मैं देख रहा हूं। –

+1

ऐसा प्रतीत होता है कि AttributeUsageAttribute विरासत ध्वज विरासत में नहीं मिला है, हालांकि कोई इसे एट्रिब्यूट यूजएट्रिब्यूट के रूप में सजाएगा [AttributeUsage (AttributeTargets.Class, Inherited = true)] के साथ सजाया गया है। –

उत्तर

0

.NET 4.0 में मेटाडेटा के अनुसार, AttributeUsageAttribute कक्षा [AttributeUsage(AttributeTargets.Class, Inherited = true)] के साथ चिह्नित है। इसलिए, यदि आपकी विशेषता वर्ग (BaseAttribute, आपके उदाहरण में) है, तो इसमें AttributeUsageAttribute लागू है (जैसा कि सभी Attribute वर्गों को चाहिए, लेकिन अगर वे नीचे नहीं देखते हैं तो कुछ भी तोड़ें नहीं), तो BaseAttribute से प्राप्त किसी भी वर्ग को चाहिए उस पर लागू AttributeUsage विशेषता का उत्तराधिकारी है।

आपका Derived वर्ग बेस से DerivedAttribute इनहेरिट करती है, क्योंकि DerivedAttribute, तो प्रतिबिंब एपीआई BaseAttribute की विशेषता पर निर्भर करता है अपने स्वयं के AttributeUsageAttribute यह करने के लिए लागू नहीं है। अब, को अपने BaseAttribute कक्षा से बाहर ले जाएं, और आपको एक ही परिणाम मिल जाएगा, क्योंकि आधार System.Attribute कक्षा [AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = false)] के साथ चिह्नित है। इस प्रकार, जब तक आप एक अलग निर्दिष्ट नहीं करते हैं, तब तक कोई भी विशेषता वर्ग इस विशेषता का उत्तराधिकारी होगा।

वाह, ये जटिल पैराग्राफ हैं। विशेषताओं पर गुण कुछ भारी पढ़ने के लिए बनाता है: पी

+1

लेकिन मेरा 'बेस एट्रिब्यूट' को _not_ को विरासत योग्य घोषित करने के लिए घोषित किया गया है। इसलिए, यदि प्रतिबिंब API 'BaseAttribute' के घोषित विशेषता उपयोग पर निर्भर करता है, तो 'DerivedAttribute' विरासत योग्य क्यों होगा? –

+0

एचएम ... अच्छा, फिर ... अच्छा सवाल! –

संबंधित मुद्दे