2011-12-19 10 views
8

He el siguiente escenario.NET propiedad privada a través de la reflexión

Assebly Un

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

} 

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

En el MyBaseEntity clase trato de conseguir que el niño IColoque privada y llama al método "Agregar". que llamo el método de "addChild" como

myObject.addChild<MyModelChild>(child); 

pero el método GetProperties no extrae la propiedad privada. Puede extraer todas las propiedades públicas pero no las privadas.

¿Alguien me puede ayudar?

¡Gracias!

+0

Creo que tiene un error tipográfico en su código de ensamblado A (no está haciendo nada con pInfo). También me pregunto cuál es el objetivo de hacer que AddChild sea virtual si vas a hacer una reflexión dentro de él en lugar de simplemente anularlo en clases heredadas. –

+0

@Malcom O'Hare ¡tienes razón! He comentado el método como "incompleto" y eliminado virtual – Faber

Respuesta

18

Las dos partes privadas a las que se refiere son campos, no propiedades, naturalmente no las encontrará con GetProperties (puede usar GetFields para eso).

+0

Lo he intentado también con GetFields (BindingFlags.NonPublic) pero tampoco funciona – Faber

+1

Lo he intentado de nuevo con GetFields (BindingFlags.Instance) y ahora funciona correctamente ! ¡Gracias! – Faber

Cuestiones relacionadas