2011-12-19 12 views
8

के माध्यम से निजी संपत्ति प्राप्त मैंने इस परिदृश्य परनेट प्रतिबिंब

assebly एक

public abstract class MyBaseEntity   
{ 
    //Uncompleted method  
    public void addChild<T>(T child) 
    {    

     try 
     {     
      Type tInfo = this.GetType(); 
      PropertyInfo pInfo = tInfo.GetProperties(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance).Where(p => p.PropertyType == typeof(ISet<T>)).FirstOrDefault();     
      MethodInfo mInfo = tInfo.GetMethod("Add"); 
      mInfo.Invoke(this, new object[] {child}); 
     } 
     catch (Exception ex) 
     {    
      throw ex; 
     } 
    } 

} 

विधानसभा बी

public class MyModel : MyBaseEntity 
{ 
    public virtual int p1 { get; set; } 
    public virtual int p2 { get; set; } 
    public virtual DateTime p3 { get; set; } 
    public virtual bool p4 { get; set; } 
    private readonly ISet<MyModelChild> _p5; 
    private readonly ISet<MyModelChild2> _p6; 
    public virtual string p7 { get; set; } 

    public MyModel() 
    { 
     this._p5 = new HashSet<MyModelChild>(); 
     this._p6 = new HashSet<MyModelChild2>(); 
    } 

    public virtual IEnumerable<MyModelChild> P5 
    { 
     get { return _p5; } 
    } 

    public virtual IEnumerable<MyModelChild2> P6 
    { 
     get { return _p6; } 
    } 
}  

वर्ग MyBaseEntity में मैं निजी Iset बच्चे प्राप्त करने की कोशिश और विधि "जोड़ें" कॉल करें। मैं

myObject.addChild<MyModelChild>(child); 

की तरह "addChild" विधि कॉल लेकिन GetProperties विधि निजी संपत्ति को अलग नहीं करता। यह सभी सार्वजनिक संपत्तियों को निकाल सकता है लेकिन निजी नहीं।

कोई भी मेरी मदद कर सकता है?

धन्यवाद!

+0

मुझे लगता है कि आपके असेंबली ए कोड में एक टाइपो है (आप पीएनएफओ के साथ कुछ भी नहीं कर रहे हैं)। मैं यह भी सोच रहा हूं कि AddChild वर्चुअल बनाने का क्या मतलब है यदि आप इसे कक्षाओं में विरासत में ओवरराइड करने के बजाय इसके अंदर प्रतिबिंब करने जा रहे हैं। –

+0

@ माल्कॉम ओहारे आप सही हैं! मैंने विधि को "अपूर्ण" के रूप में टिप्पणी की है और वर्चुअल – Faber

उत्तर

18

आपके द्वारा संदर्भित दो निजी क्षेत्र फ़ील्ड हैं, गुण नहीं, स्वाभाविक रूप से आप उन्हें GetProperties के साथ नहीं पाएंगे (आप इसके लिए GetFields का उपयोग कर सकते हैं)।

+0

हटा दिया है मैंने गेटफिल्ड्स (बाइंडिंगफ्लैग्स नॉनपब्लिक) के साथ भी कोशिश की है लेकिन यह – Faber

+1

पर भी काम नहीं करता है मैंने गेटफिल्ड्स (बाइंडिंगफ्लैग्स.इन्स्टेंस) के साथ फिर कोशिश की है और अब ठीक से काम करता है ! धन्यवाद! – Faber