2009-03-26 12 views
17

मैं सी # में प्रतिबिंब पर एक पूर्ण नौसिखिया हूं। मैं विरासत में शामिल सभी सहित, एक वर्ग में सभी निजी क्षेत्रों तक पहुंचने के लिए प्रतिबिंब का उपयोग करना चाहता हूं।सी #: प्रतिबिंब के माध्यम से विरासत निजी इंस्टेंस सदस्यों तक पहुंच

मैं विरासत में रहने वाले सभी निजी क्षेत्रों तक पहुंचने में सफल रहा हूं, साथ ही साथ सभी सार्वजनिक और संरक्षित विरासत वाले क्षेत्र भी शामिल हैं। हालांकि, मैं निजी, विरासत वाले क्षेत्रों तक पहुंचने में सक्षम नहीं हूं। निम्नलिखित उदाहरण दिखाता है:

class A 
{ 
    private string a; 
    public string c; 
    protected string d; 
} 

class B : A 
{ 
    private string b; 
} 

class test 
{ 
    public static void Main(string[] Args) 
    { 
     B b = new B();  
     Type t; 
     t = b.GetType(); 
     FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic 
             | BindingFlags.Instance); 
     foreach(FieldInfo fi in fields){ 
      Console.WriteLine(fi.Name); 
     } 
     Console.ReadLine(); 
    } 
} 

यह फ़ील्ड बीए खोजने में विफल रहता है।

क्या यह भी पूरा करना संभव है? स्पष्ट समाधान निजी, विरासत वाले क्षेत्रों को संरक्षित क्षेत्रों में परिवर्तित करना होगा। हालांकि, इस समय, मेरे नियंत्रण से बाहर है।

उत्तर

14

जैसा कि ली ने कहा, आप इसे रिकर्सन के साथ कर सकते हैं।

private static void FindFields(ICollection<FieldInfo> fields, Type t) { 
    var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; 

    foreach (var field in t.GetFields(flags)) { 
     // Ignore inherited fields. 
     if (field.DeclaringType == t) 
      fields.Add(field); 
    } 

    var baseType = t.BaseType; 
    if (baseType != null) 
     FindFields(fields, baseType); 
} 

public static void Main() { 
    var fields = new Collection<FieldInfo>(); 
    FindFields(fields, typeof(B)); 
    foreach (FieldInfo fi in fields) 
     Console.WriteLine(fi.DeclaringType.Name + " - " + fi.Name); 
} 
+0

विरासत वाले क्षेत्रों को अनदेखा करने के लिए "अगर" खंड के बजाय, आप केवल बाइंडिंगफ्लैग निर्दिष्ट कर सकते हैं। केवल घोषित किया गया है। – Timwi

+0

किसी प्रकार पर बेसटाइप का उपयोग करके बाहर, क्या हम अभी भी बेस क्लास निजी सदस्य तक पहुंच सकते हैं। नहीं, यह मेरे लिए किसी भी वास्तविक दुनिया की समस्या को हल नहीं कर रहा है, लेकिन मैं सिर्फ उत्सुक हूं क्योंकि टाइप क्लास की बेसटाइप संपत्ति का उपयोग करके मुझे विश्वास है कि (इसे लिखते समय) मैं चाइल्ड बेस क्लास सदस्यों तक पहुंच रहा हूं, इसलिए क्या इसका उपयोग करने के साथ कोई और तरीका है बेसटाइप संपत्ति को प्राप्त करने के लिए? – Zenwalker

0

आप क्योंकि उन क्षेत्रों B में मौजूद नहीं है B के प्रकार का उपयोग कर A के निजी क्षेत्रों का उपयोग नहीं कर सकते हैं - वे केवल A में मौजूद हैं। आपको या तो A के प्रकार को सीधे निर्दिष्ट करने की आवश्यकता है, या अन्य माध्यमों के माध्यम से इसे पुनर्प्राप्त करें (जैसे B के प्रकार से बेस क्लास प्राप्त करना)।

+3

बकवास के रूप में कक्षा एक बनाने के लिए, निश्चित रूप से वे बी में मौजूद हैं यदि वे बी में नहीं थे, कैसे एक विधि एक से विरासत में मिला सकता है इस तरह के एक निजी क्षेत्र का काम तक पहुँचता है कि ? – Timwi

+4

बी के उदाहरण में ए के निजी सदस्य हो सकते हैं, लेकिन बी के प्रकार को ऐसे सदस्यों का कोई ज्ञान नहीं है। – Andy

4

मैंने कोशिश नहीं की है, लेकिन आप टाइप प्रकार के निजी सदस्यों को Type.BaseType संपत्ति के माध्यम से एक्सेस करने और उत्तराधिकारी पदानुक्रम के माध्यम से सभी निजी क्षेत्रों को फिर से जमा करने में सक्षम होना चाहिए।

-1

आप के साथ कक्षा बी से क्लास ए की निजी सदस्यों तक पहुँच सकते हैं 'नेस्ट क्लासेस' । आप बाहरी कक्षा और कक्षा बी के रूप में इनर कक्षा

Class A 
{ 
... 
Class B 
{ 
....... 
    } 

} 
+2

मैं कक्षाओं को संशोधित करने में सक्षम नहीं हूं। मैं प्रतिबिंब के माध्यम से उनके बारे में जानकारी हासिल करने की कोशिश कर रहा हूं। – Odrade

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