2011-12-19 26 views
8

Tôi đã kịch bản sau đâyNET Get sở hữu tư nhân thông qua Reflection

assebly Một

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

} 

hội 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; } 
    } 
}  

Trong MyBaseEntity lớp tôi cố gắng để có được những con ISET tin và gọi phương thức "Thêm". tôi gọi là phương pháp "addChild" như

myObject.addChild<MyModelChild>(child); 

nhưng phương pháp GetProperties không trích xuất các tài sản cá nhân. Nó có thể trích xuất tất cả các tài sản công cộng nhưng không phải là riêng tư.

Bất cứ ai cũng có thể giúp tôi?

Cảm ơn bạn!

+0

Tôi nghĩ bạn có lỗi đánh máy trong mã Assembly A (bạn không làm gì với pInfo). Tôi cũng tự hỏi những gì làm cho điểm AddChild ảo là nếu bạn đang đi để làm phản ánh bên trong của nó thay vì chỉ ghi đè nó trong kế thừa các lớp học. –

+0

@Malcom O'Hare bạn nói đúng! Tôi đã nhận xét các phương pháp là "chưa hoàn thành" và loại bỏ ảo – Faber

Trả lời

18

Hai cá nhân bạn tham chiếu là các trường chứ không phải thuộc tính, tự nhiên bạn sẽ không tìm thấy chúng với GetProperties (bạn có thể sử dụng GetFields cho điều đó).

+0

Tôi đã thử cũng với GetFields (BindingFlags.NonPublic) nhưng nó không hoạt động quá – Faber

+1

Tôi đã thử lại với GetFields (BindingFlags.Instance) và bây giờ hoạt động đúng ! Cảm ơn bạn! – Faber

Các vấn đề liên quan