2011-03-09 20 views
15

¿Es posible acceder a un campo estático privado dentro de una clase estática, utilizando la clase de prueba de unidad VS2010 PrivateObject?¿Puedo usar VS2010 PrivateObject para acceder a un campo estático dentro de una clase estática?

Digamos que tengo la clase siguiente:

public static class foo 
{ 
    private static bar; 
} 

puedo usar PrivateObject para crear una copia de foo, y luego la barra campo ?

+2

¿Por qué necesita acceder a un campo privado en una prueba de unidad? Por lo general, no es una buena práctica hacerlo. – CheeZe5

+0

No puedo cambiar el código probado, sin embargo, quiero obtener datos de un campo privado específico .... –

+0

posible duplicado de [C# - Obtener campo privado de la clase estática] (http://stackoverflow.com/questions/628666/c-get-private-field-from-static-class) –

Respuesta

5

El valor de la propiedad se puede recuperar utilizando la reflexión. Esto requerirá el uso de Type.GetField Method (String, BindingFlags) y la clase PrivateType FieldInfo.GetValue Method

string propertyName = "bar"; 
FieldInfo fieldInfo = typeof(foo).GetField(propertyName, BindingFlags.NonPublic | BindingFlags.Static); 
object fieldValue = fieldInfo.GetValue(null); 
+0

¡Eso funcionó muy bien! ¡muchas gracias! –

5

La respuesta de Deepun puede ser muy útil. Quería agregar un ejemplo específico para ayudar a las personas que vienen de esta manera.

Clase con miembro estático privado.

public class foo 
{ 
    private static int bar; 
} 

Código para obtener valor.

PrivateType pt = new PrivateType(typeof(foo)); 
int bar = (int)pt.GetStaticFieldOrProperty("bar"); 

Código para cambiar el valor

PrivateType pt = new PrivateType(typeof(foo)); 
pt.SetStaticFieldOrProperty("bar", 10); 

Esto funcionará independientemente de la clase de ser estática o no.

Cuestiones relacionadas