2011-12-19 2 views
8

Я следующий сценарий.NET Получить частную собственность с помощью Reflection

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 я пытаюсь получить частный Исеть ребенка и вызовите метод «Добавить». я вызываю метод «AddChild» как

myObject.addChild<MyModelChild>(child); 

но метод GetProperties не извлекает частную собственность. Он может извлекать все публичные свойства, но не частные.

Кто-нибудь может мне помочь?

Спасибо!

+0

Я думаю, что у вас есть опечатка в вашей сборке. Код (вы ничего не делаете с pInfo). Мне также интересно, какой смысл делать AddChild virtual, если вы собираетесь делать отражение внутри него, а не просто переопределять его в наследующих классах. –

+0

@Malcom O'Hare, вы правы! Я прокомментировал этот метод как «незавершенный» и удалил виртуальный – Faber

ответ

18

Два частных лица, которых вы называете, являются полями, а не свойствами, естественно, вы не найдете их с GetProperties (для этого вы можете использовать GetFields).

+0

Я тоже пробовал с GetFields (BindingFlags.NonPublic), но он тоже не работает – Faber

+1

Я уже пробовал с GetFields (BindingFlags.Instance) и теперь работает правильно ! Спасибо! – Faber