2012-09-08 6 views
7

प्रतिबिंब का उपयोग कर विरासत संपत्ति मूल्य कैसे प्राप्त करें? मैं BindingFlags के साथ प्रयास करें, लेकिन अभी भी गति प्रदान NullReferenceExceptionप्रतिबिंब का उपयोग कर विरासत संपत्ति का मूल्य कैसे प्राप्त करें?

object val = targetObject.GetType().GetProperty("position", BindingFlags.FlattenHierarchy).GetValue(targetObject, null); 

position सार्वजनिक संपत्ति iherited और एक घोषित मूल्य है।

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

class myParent 
{ 
    public float[] position; 
    public myParent() 
    { 
     this.position = new float[] { 1, 2, 3 }; 
    } 
} 

class myChild : myParent 
{ 
    public myChild() : base() { } 
} 

myChild obj = new myChild(); 
PropertyInfo p = obj.GetType().GetProperty("position", BindingFlags.Instance | BindingFlags.Public); 

मैं BindingFlags के साथ कई संयोजनों लेकिन p हमेशा अशक्त :(है के साथ की कोशिश की,

+2

क्या आप कक्षा पोस्ट कर सकते हैं जिसमें विरासत संपत्ति है? –

+0

अब एक नज़र डालें। – abuduba

+0

@abuduba मेरा अद्यतन उत्तर देखें – nemesv

उत्तर

11

आप BindingFlags साथ अधिभार का उपयोग करते हैं आप स्पष्ट रूप से सभी झंडे बारे में बताने की क्या आप रुचि रखते हैं।

यह भी ध्यान दें कि: (MSDN से)

आपको वापसी प्राप्त करने के लिए या तो बाध्यकारीफ्लैग्स। इंस्टेंस या बाइंडिंगफ्लैग्स। स्टेटिक निर्दिष्ट करना होगा।

object val = targetObject.GetType() 
      .GetProperty("position", 
          BindingFlags.FlattenHierarchy | 
          BindingFlags.Instance | 
          BindingFlags.Public) 
      .GetValue(targetObject, null); 

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

आप एक positionक्षेत्र नहीं एक संपत्ति!।

(ए अच्छी जगह अंतर सीखने शुरू करने के लिए: Difference between Property and Field in C# 3.0+ विशेष रूप से इस answer)

अपने position एक संपत्ति में बदलें:

public float[] position { get; set; } 

या आप क्षेत्र को पुनः प्राप्त करने targetObject.GetType().GetField(... विधि का उपयोग करें।

1
BindingFlags.FlattenHierarchy 

केवल स्थिर सदस्यों के लिए काम करता है।

BindingFlags.Instance | BindingFlags.Public 

और आपको विरासत गुण प्राप्त करना सुनिश्चित करें।

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