关于c#:我可以使用VS2010 PrivateObject来访问静态类中的静态字段吗?

Can i use VS2010 PrivateObject to access a static field inside a static class?

是否可以使用VS2010单元测试类PrivateObject访问静态类中的私有静态字段?

假设我有以下课程:

1
2
3
4
public static class foo
{
    private static bar;
}

我可以使用PrivateObject创建foo的副本,然后获取bar字段吗?


PrivateType类类似于PrivateObject,用于调用私有静态成员。 可以使用重载的GetStaticFieldOrProperty方法。
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privatetype(v=VS.100).aspx


Deepun的答案非常有用。 我想添加一个具体的例子来帮助那些来这种方式的人。

具有私有静态成员的类。

1
2
3
4
public class foo
{
   private static int bar;
}

代码获得价值。

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

代码改变价值

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

无论是否为静态类,这都可以工作。


可以使用反射来检索属性值。 这将需要使用Type.GetField方法(String,BindingFlags)和FieldInfo.GetValue方法

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