Dada esta clase
class Foo
{
// Want to find _bar with reflection
[SomeAttribute]
private string _bar;
public string BigBar
{
get { return this._bar; }
}
}
Quiero encontrar el elemento privado _bar que marcaré con un atributo. ¿Es eso posible?
He hecho esto con propiedades donde he buscado un atributo, pero nunca un campo de miembro privado.
¿Cuáles son los indicadores de enlace que debo establecer para obtener los campos privados?
c#
.net
reflection
.net-attributes
David Basarab
fuente
fuente
Respuestas:
Uso
BindingFlags.NonPublic
yBindingFlags.Instance
banderasfuente
Puedes hacerlo como con una propiedad:
fuente
Obtenga el valor de la variable privada usando Reflection:
Establezca el valor para la variable privada usando Reflection:
Donde objectForFooClass es una instancia no nula para el tipo de clase Foo.
fuente
GetInstanceField(typeof(YourClass), instance, "someString") as string
¿Cómo obtener el valor del campo privado en C #?Una cosa que debe tener en cuenta al reflexionar sobre los miembros privados es que si su aplicación se ejecuta con una confianza media (como, por ejemplo, cuando se ejecuta en un entorno de alojamiento compartido), no los encontrará: el La opción BindingFlags.NonPublic simplemente se ignorará.
fuente
fuente
Buena sintaxis con método de extensión
Puede acceder a cualquier campo privado de tipo arbitrario con un código como este:
Para eso, debe definir un método de extensión que haga el trabajo por usted:
fuente
Yo uso este método personalmente
fuente
Aquí hay algunos métodos de extensión para obtener y establecer campos privados y propiedades (propiedades con setter):
ejemplo de uso:
Código:
fuente
Sí, sin embargo, deberá establecer sus indicadores de enlace para buscar campos privados (si está buscando al miembro fuera de la instancia de clase)
El indicador de enlace que necesitará es: System.Reflection.BindingFlags.NonPublic
fuente
Me encontré con esto mientras buscaba esto en Google, así que me doy cuenta de que estoy tropezando con una publicación anterior. Sin embargo, GetCustomAttributes requiere dos parámetros.
El segundo parámetro especifica si desea o no buscar en la jerarquía de herencia
fuente