¿Hay alguna forma de obtener valor del campo estático privado de la clase conocida utilizando la reflexión?¿Cómo obtener el valor de un campo estático privado de una clase?
Respuesta
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.
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.
MemberInfo no tiene los métodos 'GetValue (...)' o 'SetValue (...)'. Los miembros son más a menudo métodos/funciones reales. – IAbstract
Como se indicó anteriormente, probablemente pueda usar System.Type::GetMembers()
con BindingFlags
::NonPublic | BindingFlags::Static
, pero solo si tiene el derecho ReflectionPermission
.
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.
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].
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
@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. –
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
- 1. Establecer el valor del campo estático privado
- 2. Reflejando un campo privado de una clase base
- 3. Obtener el valor de un campo estático público a través de la reflexión
- 4. ¿Cómo obtener el equivalente de un campo estático (clase) en Delphi?
- 5. Spring: cómo inyectar un valor al campo estático?
- 6. ¿Cómo me burlo de un campo privado?
- 7. ¿Cómo puedo hacer referencia al valor de un campo estático final en la clase?
- 8. C# privado, estático y de solo lectura
- 9. Prueba de PowerMock: establecer el campo estático de la clase
- 10. Refactorización para mover un campo privado de una clase a su clase auxiliar?
- 11. ¿Puedo usar VS2010 PrivateObject para acceder a un campo estático dentro de una clase estática?
- 12. ¿Cómo puedo obtener el valor de una variable de sesión dentro de un método estático?
- 13. C# campo estático clase abstracta herencia
- 14. ¿Es posible configurar este miembro privado estático de una clase estática con reflexión?
- 15. Visibilidad Java campo privado
- 16. Obtener valor de campo oculto
- 17. ¿Es posible declarar un valor constante estático virtual en una clase de C++?
- 18. Cómo obtener el nombre de clase del método hijo estático
- 19. ¿Una propiedad abstracta crea un campo de respaldo privado?
- 20. Inicializar un mapa privado estático como vacío
- 21. Clase de miembro estático: ¿declara clase privada y miembro de clase paquete privado?
- 22. Busque un campo privado con Reflection?
- 23. Obtener todo el valor de campo de texto ubicado en una clase específica
- 24. ¿Cómo crear un método de clase privado?
- 25. ¿Cómo obtener la clase de un campo de tipo T?
- 26. Cómo anular el valor predeterminado de un campo de modelo de una base abstracta Clase
- 27. Cómo inyectar el simulacro de EasyMock en el campo privado de la clase probada
- 28. Cómo hacer que el resorte inyecte valor en un campo estático
- 29. ¿Cómo invoco un método estático privado usando reflection (Java)?
- 30. ¿Cómo puedo acceder a un constructor privado de una clase?
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