2009-08-24 9 views
13

में बेस क्लास स्थिर फ़ील्ड सी # में, जब मैं व्युत्पन्न प्रकार पर प्रतिबिंबित कर रहा हूं, तो मुझे बेस क्लास के स्थिर फ़ील्ड कैसे दिखाई नहीं देते हैं?सी # प्रतिबिंब - व्युत्पन्न प्रकार

मैंने type.GetFields(BindingFlags.Static) और type.GetFields() दोनों की कोशिश की है।

उत्तर

20

यह यह कैसे काम करता है। static सदस्य वास्तव में गैर-ऑब्जेक्ट उन्मुख सामग्री हैं। वे polymorphic नहीं हैं और वे वास्तव में उनके घोषित प्रकार के हैं और विरासत पदानुक्रम में अन्य प्रकार से असंबंधित हैं। उदाहरण के लिए, व्युत्पन्न वर्ग में स्थिर सदस्य तक पहुंचने से पहले बेस क्लास के लिए एक स्थिर प्रारंभकर्ता को चलाने की आवश्यकता नहीं है। जब तक BindingFlags.FlattenHierarchy निर्दिष्ट किया जाता है आधार वर्ग के

static सदस्यों लौटा दिए जाते हैं नहीं:

type.GetFields(BindingFlags.Static 
      | BindingFlags.FlattenHierarchy 
      | BindingFlags.Public) 
+0

ध्यान दिया जाना चाहिए कि यह अभी भी बेस क्लास पर * निजी * स्टेटिक्स नहीं मिलेगा। बस अगर ओपी ऐसा करने की कोशिश कर रहा है। – womp

+0

हां, यह सिर्फ एक उदाहरण था। यदि आपको इसकी आवश्यकता हो तो बस 'बाइंडिंगफ्लैग नॉनपब्लिक' जोड़ें। –

+2

वह अभी भी वास्तव में ऐसा नहीं करेगा। आपको सीधे बेस क्लास पर निजी स्थिर क्षेत्रों पर प्रतिबिंबित करना होगा। हालांकि मुझे उम्मीद है कि ओपी ऐसा करने की कोशिश नहीं कर रहा है;) – womp

6

क्योंकि वे मूल प्रकार के हैं, और विरासत में नहीं हैं। उस प्रकार तक ले जाएं, और आप उन्हें पाएंगे।

- संपादित करें

Mehrdad सही जवाब है, लेकिन सिर्फ पूर्णता के लिए:

foreach(FieldInfo f in b.GetType().GetFields(
    BindingFlags.Static 
    | BindingFlags.FlattenHierarchy 
    | BindingFlags.Instance 
    | BindingFlags.Public 
    )){ 
    Console.WriteLine("found: " + f.Name); 
} 
3

आपका प्रकार बस अपने प्रकार है - यह आधार प्रकार शामिल नहीं है। यदि आप बेस क्लास में फ़ील्ड खोजना चाहते हैं तो आपको BindingFlags.FlattenHierarchy का उपयोग करने की आवश्यकता होगी।

आपको जो चाहिए उसे पूरा करने के लिए आपको शायद BindingFlags documentation पर एक नज़र डालना चाहिए।