c# - sirve - public string nombre get set
¿Cómo encontrar si una variable miembro es de solo lectura? (2)
f.Attributes
deben contener FieldAttributes.InitOnly
class Bla
{
public readonly int sum;
}
FieldInfo f = type.GetField("sum");
f.?? // what?
¿Cómo encuentro si la sum
es de solo lectura o no? Para las propiedades, puedo hacer PropertyInfo.CanWrite
para encontrar si el miembro tiene acceso de escritura.
readonly
significa que la asignación de campos solo puede ocurrir cerca de una declaración de campo o dentro de un constructor. Por lo que puede utilizar la propiedad IsInitOnly
en un FieldInfo
, que
Obtiene un valor que indica si el campo solo se puede establecer en el cuerpo del constructor
Más detalles están en el artículo de IsInitOnly
MSDN
FieldInfo f = typeof(Bla).GetField("sum");
Console.WriteLine(f.IsInitOnly); //return true
Notas: también puede usar la propiedad IsLiteral
para probar si el campo es una constante de tiempo compilada. readonly
false para el campo de readonly
, pero verdadero para los campos, marcados con const
.
Otra nota: la reflexión no le impide escribir en private
campo de readonly
y private
(lo mismo se aplica al public readonly
, pero quiero mostrar un caso más restringido). Por lo tanto, los siguientes ejemplos de código son válidos y no emitirán ninguna excepción:
class Bla
{
//note field is private now
private readonly int sum = 0;
}
Ahora, si obtiene el campo y le escribe un valor (uso BindingFlags
para obtener campos privados no estáticos, porque GetField
no devolverá FieldInfo
para campos privados de forma predeterminada)
FieldInfo field = typeof(Bla).GetField("sum", BindingFlags.NonPublic |
BindingFlags.Instance);
var bla = new Bla();
field.SetValue(bla, 42);
Console.WriteLine(field.GetValue(bla)); //prints 42
Todo funciona bien. Lanzará una excepción solo si un campo es const
.