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

Posted

技术标签:

【中文标题】我可以使用 VS2010 PrivateObject 访问静态类中的静态字段吗?【英文标题】:Can i use VS2010 PrivateObject to access a static field inside a static class? 【发布时间】:2011-07-12 00:45:23 【问题描述】:

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

假设我有以下课程:

public static class foo

    private static bar;

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

【问题讨论】:

为什么需要在单元测试中访问私有字段?这样做通常不是最佳做法。 我无法更改测试代码,但是我确实想从特定的私有字段中获取数据...... C# - Get Private Field from Static Class 的可能重复项 我觉得这不是用于单元测试...投票以重复结束。 其实这是一个单元测试。 【参考方案1】:

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

【讨论】:

应该使用InvokeStatic方法。【参考方案2】:

Deepun 的回答非常有用。我想添加一个具体的例子来帮助那些来到这里的人。

具有私有静态成员的类。

public class foo

   private static int bar;

获取价值的代码。

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

改变值的代码

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

无论类是否为静态,这都会起作用。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于我可以使用 VS2010 PrivateObject 访问静态类中的静态字段吗?的主要内容,如果未能解决你的问题,请参考以下文章

将VS 2008与VS 2010结合使用

vs2010可以编译fmt吗

vs2010(vs2008、vs2012)打不开

我可以在 .NET 1.1 项目中使用在 VS2010 .NET 4.0 中创建的类库吗

我可以在我的开发机器上为 C# VS2010 项目使用哪种轻量级 SQL Server 类型?

VS2010 和 VS2012 项目可以同时在同一个源代码上吗