2009-03-10 7 views

Respuesta

60

Sí.

Type type = typeof(TheClass); 
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static); 
object value = info.GetValue(null); 

Esto es para un campo. Para una propiedad, cambie type.GetField a type.GetProperty. También puede acceder a métodos privados de manera similar.

+1

Vale la pena señalar que el campo estático también se puede asignar a través de 'info.SetValue (null, value)'. Usé esta respuesta para establecer un valor para un campo estático. – IAbstract

-1

intentar algo como esto:

Type type = typeof(MyClass); 
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static); 

Me gustaría pensar que es debería funcionar.

+0

MemberInfo no tiene los métodos 'GetValue (...)' o 'SetValue (...)'. Los miembros son más a menudo métodos/funciones reales. – IAbstract

1

Si tiene plena confianza, usted debe ser capaz de hacer:

Type t = typeof(TheClass); 
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static); 
object fieldValue = field.GetValue(myObject); 

Sin embargo, si ejecuta esto en un sistema sin plena confianza, la llamada GetField fallará, y esto no va a funcionar.

5

Supongo que alguien debería preguntar si esta es una buena idea o no. Crea una dependencia en la implementación privada de esta clase estática. La implementación privada está sujeta a cambios sin previo aviso a las personas que utilizan Reflection para acceder a la implementación privada.

Si las dos clases están pensadas para funcionar juntas, considere realizar el campo interno y agregar el conjunto de la clase cooperante en un atributo [assembly: InternalsVisibleTo].

+1

En el código de producción esto generalmente es una mala idea. Sin embargo, puede ser muy útil cuando se realizan pruebas unitarias, ya que puede escribir pruebas sin tener que exponer los campos que prefiere mantener en privado. – AVee

+3

@AVee: para pruebas unitarias, configure el campo 'interno' y use' InternalsVisibleTo'. Mejor, las pruebas unitarias no deberían probar la implementación, solo el comportamiento correcto. Al depender del campo privado, ahora la prueba unitaria se romperá si la implementación de la clase cambia. –

+1

Estoy de acuerdo con @JohnSaunders reflexión como esta es muy frágil. Sin embargo, existen casos en los que debería existir como una solución temporal, es decir, el código de producción ya se ha publicado, pero necesitaba una utilidad especial para ejecutar algunas pruebas de aceptación. Solo pude lograr esto accediendo a un campo estático privado a través de la reflexión. Este código cambiará y la clase reflejada se modificará para permitir la interacción requerida por la nueva utilidad en la próxima versión. – IAbstract

Cuestiones relacionadas