我可以使用VS2010 PrivateObject来访问静态类中的静态字段吗?

Yif*_*zur 19 .net c# visual-studio-2010

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

假设我有以下课程:

public static class foo
{
    private static bar;
}
Run Code Online (Sandbox Code Playgroud)

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

小智 31

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

  • 应该使用InvokeStatic方法. (3认同)

den*_*ver 8

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

具有私有静态成员的类.

public class foo
{
   private static int bar;
}
Run Code Online (Sandbox Code Playgroud)

代码获得价值.

PrivateType pt = new PrivateType(typeof(foo));
int bar = (int)pt.GetStaticFieldOrProperty("bar");
Run Code Online (Sandbox Code Playgroud)

代码改变价值

PrivateType pt = new PrivateType(typeof(foo));
pt.SetStaticFieldOrProperty("bar", 10);
Run Code Online (Sandbox Code Playgroud)

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


Dev*_*van 6

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

string propertyName = "bar";
FieldInfo fieldInfo = typeof(foo).GetField(propertyName, BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = fieldInfo.GetValue(null);
Run Code Online (Sandbox Code Playgroud)