.NET Получить частную собственность через Reflection - PullRequest
9 голосов
/ 19 декабря 2011

У меня следующий сценарий

Собственно A

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

}

Сборка 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; }
    }
}    

В классе MyBaseEntity я пытаюсь получить закрытый дочерний элемент ISet и вызываю метод «Добавить». Я вызываю метод "addChild" как

myObject.addChild<MyModelChild>(child);

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

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

Спасибо!

1 Ответ

19 голосов
/ 19 декабря 2011

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

...