2011-12-19 152 views
8

獲取私有財產我有以下情形.NET通過反射

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

} 

組件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方法不提取的私有財產。它可以提取所有公共財產,但不是私人財產。

任何人都可以幫到我嗎?

謝謝!

+0

我在想你在Assembly A中有一個錯字(你沒有對pInfo做任何事情)。我也想知道讓AddChild虛擬化的意義在於,如果您要在其中進行反射而不是在繼承類中重寫它, – 2011-12-19 18:23:52

+0

@Malcom O'Hare你是對的!我已經評論該方法爲「未完成」,並刪除了虛擬 – Faber 2011-12-19 22:53:42

回答

18

你引用的兩個私人是字段,而不是屬性,當然你不會找到他們與GetProperties(你可以使用GetFields)。

+0

我也嘗試過GetFields(BindingFlags.NonPublic),但它不工作太 – Faber 2011-12-19 22:57:23

+1

我再次嘗試GetFields(BindingFlags.Instance),現在工作正常!謝謝! – Faber 2011-12-20 09:01:32