una sirve que propiedad programacion para objeto nombre instanciar inicializar ejemplos ejemplo clase c# .net reflection readonly fieldinfo

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 .