Así que esto parece bastante básico, pero no puedo hacerlo funcionar. Tengo un objeto y estoy usando la reflexión para llegar a sus propiedades públicas. Una de estas propiedades es estática y no tengo suerte para acceder a ella.
Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
Return obj.GetType.GetProperty(propName)
End Function
El código anterior funciona bien para las propiedades de instancia pública, que hasta ahora es todo lo que necesitaba. Supuestamente puedo usar BindingFlags para solicitar otros tipos de propiedades (privadas, estáticas), pero parece que no puedo encontrar la combinación correcta.
Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)
End Function
Pero aún así, solicitar que cualquier miembro de Static no devuelva nada. El reflector .NET puede ver las propiedades estáticas muy bien, así que claramente me falta algo aquí.
.net
reflection
static
Corey Downie
fuente
fuente
Respuestas:
O simplemente mira esto ...
fuente
p.GetValue(null);
también funciona. El segundonull
no es obligatorio.Esto es C #, pero debería darte la idea:
(necesita OR NonPublic y Static solamente)
fuente
BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy
fue lo único que funcionó para mí.Un poco de claridad ...
fuente
BindingFlags.Instance | BindingFlags.Static
me lo resolvió.Ok, entonces la clave para mí fue usar .FlattenHierarchy BindingFlag. Realmente no sé por qué lo agregué por una corazonada y comenzó a funcionar. Entonces, la solución final que me permite obtener Instancia pública o Propiedades estáticas es:
fuente
Esto devolverá todas las propiedades estáticas en la clase base estática o un tipo en particular y probablemente también el hijo.
fuente
Solo quería aclarar esto por mí mismo, mientras utilizo la nueva API de reflexión basada en
TypeInfo
- dondeBindingFlags
no está disponible de manera confiable (según el marco de trabajo de destino).En la reflexión 'nueva', para obtener las propiedades estáticas de un tipo (sin incluir las clases base), debe hacer algo como:
Se adapta tanto a propiedades de solo lectura como de solo escritura (a pesar de que solo escritura es una idea terrible).
El
DeclaredProperties
miembro tampoco distingue entre propiedades con descriptores de acceso públicos / privados; por lo tanto, para filtrar la visibilidad, debe hacerlo en función del descriptor de acceso que necesite utilizar. Por ejemplo, suponiendo que la llamada anterior haya regresado, podría hacer:Hay algunos métodos de acceso directo disponibles, pero en última instancia, todos escribiremos muchos más métodos de extensión en torno a los
TypeInfo
métodos / propiedades de consulta en el futuro. Además, la nueva API nos obliga a pensar exactamente en lo que consideramos una propiedad 'privada' o 'pública' a partir de ahora, porque debemos filtrarnos en función de los accesos individuales.fuente
Lo siguiente parece funcionar para mí.
fuente
Prueba esta reflexión de C # enlace de .
Tenga en cuenta que creo que BindingFlags.Instance y BindingFlags.Static son exclusivos.
fuente