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

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

假设我有以下课程:

public static class foo
{
    private static bar;
}

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

【问题讨论】:

  • 为什么需要在单元测试中访问私有字段?这样做通常不是最佳做法。
  • 我无法更改测试代码,但是我确实想从特定的私有字段中获取数据......
  • 我觉得这不是用于单元测试...投票以重复结束。
  • 其实这是一个单元测试。

标签: c# .net visual-studio-2010


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多