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!
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. –
@Malcom O'Hare ¡tienes razón! He comentado el método como "incompleto" y eliminado virtual – Faber