2009-06-24 11 views
15

सी #, नेट 2.0इस प्रतिबिंब कोड के साथ क्या गलत है? GetFields() एक खाली सरणी लौटने

कोड यह (मैं अपने सभी डोमेन-विशिष्ट सामान बाहर ले लिया है, और यह अभी भी एक खाली सरणी देता है):

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ChildClass cc = new ChildClass(); 
      cc.OtherProperty = 1; 

      FieldInfo[] fi = cc.GetType().GetFields(); 
      Console.WriteLine(fi.Length); 
      Console.ReadLine(); 
     } 
    } 
    class BaseClass<T> 
    { 
     private int myVar; 

     public int MyProperty 
     { 
      get { return myVar; } 
      set { myVar = value; } 
     } 


    } 

    class ChildClass : BaseClass<ChildClass> 
    { 
     private int myVar; 

     public int OtherProperty 
     { 
      get { return myVar; } 
      set { myVar = value; } 
     } 

    } 
} 

उत्तर

53

parameterless GetFields()सार्वजनिक फ़ील्ड देता है। आप चाहते हैं गैर सरकारी लोगों का उपयोग करते हैं:

cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic); 

या जो भी उचित संयोजन आप चाहते हैं - लेकिन आप Instance और Static कम से कम एक निर्दिष्ट करने के लिए जरूरत करना , अन्यथा यह या तो प्राप्त नहीं कर सकेंगे। सबकुछ प्राप्त करने के लिए आप दोनों, और वास्तव में सार्वजनिक फ़ील्ड भी निर्दिष्ट कर सकते हैं:

cc.GetType().GetFields(BindingFlags.Instance | 
         BindingFlags.Static | 
         BindingFlags.NonPublic | 
         BindingFlags.Public); 
+4

+1 यह वह है, आपको * इंस्टेंस के साथ-साथ गैर-सार्वजनिक निर्दिष्ट करना होगा। –

+1

उत्तर के लिए चीयर्स! हालांकि मुझे इसे समझने में परेशानी हो रही है। क्या कोई व्यक्ति कृपया बता सकता है कि निजी क्षेत्रों के लिए गैर-सार्वजनिक के साथ इंस्टेंस या स्टेटिक क्यों आवश्यक है? – Zack

+0

@ rory.ap: हाँ, बिल्कुल। –

10

के बाद से फ़ील्ड निजी है, आपको GetFields() के अधिभार का उपयोग करने की आवश्यकता है जो आपको BindingFlags.NonPublic निर्दिष्ट करने की अनुमति देता है।

यह काम करने के लिए, के लिए इसे बदल:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
5

आपको लगता है कि आप निजी (Nonpublic) क्षेत्रों

को बदलें चाहते निर्दिष्ट करने की आवश्यकता:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
+2

यह 0 तत्वों को भी वापस कर देगा। आपको बाइंडिंगफ्लैग्स को शामिल करने की आवश्यकता है। बाइंडिंगफ्लैग्स नॉनपब्लिक के अलावा इंस्टेंस। –

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