2011-12-19 21 views
8

Mam następujący scenariuszNET Uzyskaj własności prywatnej poprzez odbicie

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; 
     } 
    } 

} 

Zgromadzenie b

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; } 
    } 
}  

w MyBaseEntity klasy I postarać się o prywatny ISET dziecko i wywołaj metodę "Dodaj". nazywam „addChild” metody jak

myObject.addChild<MyModelChild>(child); 

ale metoda GetProperties nie wyodrębnienia własności prywatnej. Może wyodrębnić wszystkie właściwości publiczne, ale nie prywatne.

Ktoś może mi pomóc?

Dziękujemy!

+0

Myślę, że masz literówkę w swoim kodzie A (nie robisz nic z pInfo). Zastanawiam się również, jaki jest sens tworzenia AddChild w wersji wirtualnej, jeśli zamierzasz robić w nim odbicie, zamiast nadpisywać je w dziedziczeniu klas. –

+0

@Malcom O'Hare masz rację! Skomentowałem metodę jako "nieukończoną" i usunąłem wirtualny – Faber

Odpowiedz

18

Dwa prywatne słowa, do których się odnosisz, są polami, a nie właściwościami, naturalnie nie znajdziesz ich pod numerem GetProperties (możesz użyć do tego celu).

+0

Próbowałem również z GetFields (BindingFlags.NonPublic), ale to też nie działa – Faber

+1

Próbowałem ponownie z GetFields (BindingFlags.Instance) i teraz działa poprawnie ! Dziękuję Ci! – Faber

Powiązane problemy