¿Puedo establecer una propiedad privada a través de la reflexión?
public abstract class Entity
{
private int _id;
private DateTime? _createdOn;
public virtual T Id
{
get { return _id; }
private set { ChangePropertyAndNotify(ref _id, value, x => Id); }
}
public virtual DateTime? CreatedOn
{
get { return _createdOn; }
private set { ChangePropertyAndNotify(ref _createdOn, value, x => CreatedOn); }
}
}
He intentado lo siguiente y no funciona, donde t
representa un tipo de Entity
:
var t = typeof(Entity);
var mi = t.GetMethod("set_CreatedOn", BindingFlags.Instance | BindingFlags.NonPublic);
Creo que puedo hacer esto, pero no puedo resolverlo.
2
Sé que es tarde, pero encontré la necesidad de este pensamiento, compartiría mi 'por qué'. Necesitaba superar un inconveniente en algún software de terceros. Específicamente, estaba usando el método Crystal Reports ExportToStream. Por la forma en que se escribió este método, no se permitió el acceso al búfer interno de la secuencia. Para enviar el informe al navegador, tuve que copiar la transmisión en un nuevo búfer (100K +) y luego enviarlo. Al establecer el campo privado '_exposable' en el objeto de flujo en 'verdadero', pude enviar el búfer interno directamente, ahorrando una asignación de 100K + en cada solicitud.
—
Ray
¿Por qué? Supongamos que tiene configuradores privados en sus propiedades de Id en todos sus objetos de dominio y desea implementar pruebas de repositorio. Entonces, solo en su proyecto de prueba de repositorio querrá poder establecer la propiedad Id.
—
bounav
Otro escenario de uso: establecer campos generados automáticamente como "fecha de creación" al importar datos.
—
ANeves
Otro por qué es que tengo curiosidad si es posible. Así es como terminé viendo esta pregunta.
—
Caleb Mauer