bien, digamos que hemos definido como una clase¿La reflexión rompe el principio de encapsulación?
public class TestClass
{
private string MyPrivateProperty { get; set; }
// This is for testing purposes
public string GetMyProperty()
{
return MyPrivateProperty;
}
}
después tratamos:
TestClass t = new TestClass { MyPrivateProperty = "test" };
compilación falla con TestClass.MyPrivateProperty is inaccessible due to its protection level
, como se esperaba.
Trate
TestClass t = new TestClass();
t.MyPrivateProperty = "test";
y compilación falla otra vez con el mismo mensaje.
Todo bien hasta ahora, esperábamos esto.
Pero entonces uno de escritura:
PropertyInfo aProp = t.GetType().GetProperty(
"MyPrivateProperty",
BindingFlags.NonPublic | BindingFlags.Instance);
// This works:
aProp.SetValue(t, "test", null);
// Check
Console.WriteLine(t.GetMyProperty());
y aquí estamos, que logró cambiar un campo privado.
¿No es anormal poder alterar el estado interno de algunos objetos simplemente mediante el reflejo?
Editar:
Gracias por las respuestas hasta ahora. Para aquellos que dicen "no tienes que usarlo": ¿qué hay de un diseñador de clases, parece que ya no puede asumir la seguridad interna del estado?
¿Solo usando el reflejo? Alguien no solo usa el reflejo, el sabe exactamente, que está rompiendo el API. –