我可以使用 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 访问静态类中的静态字段吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 .NET 1.1 项目中使用在 VS2010 .NET 4.0 中创建的类库吗