是否可以使用反射设置静态类的静态私有成员?

时间:2010-02-24 22:13:26

标签: c# reflection

我有static classstatic private readonly成员通过班级static constructor设置。以下是一个简化的例子。

public static class MyClass
{
    private static readonly string m_myField;

    static MyClass()
    {
        // logic to determine and set m_myField;
    }

    public static string MyField
    {
        get
        {
            // More logic to validate m_myField and then return it.
        }
    }
}

由于上面的类是一个静态类,我无法创建它的实例,以便将这样的传递用于FieldInfo.GetValue()调用以检索并稍后设置m_myField的值。有没有一种方法我不知道要么使用FieldInfo类来获取和设置静态类的值,还是唯一的选择是重构我被要求进行单元测试的类?

2 个答案:

答案 0 :(得分:40)

以下是一个快速示例,说明如何执行此操作:

using System;
using System.Reflection;

class Example
{
    static void Main()
    {
        var field = typeof(Foo).GetField("bar", 
                            BindingFlags.Static | 
                            BindingFlags.NonPublic);

        // Normally the first argument to "SetValue" is the instance
        // of the type but since we are mutating a static field we pass "null"
        field.SetValue(null, "baz");
    }
}

static class Foo
{
    static readonly String bar = "bar";
}

答案 1 :(得分:0)

这个“空规则”也适用于静态字段的FieldInfo.GetValue(),例如,

Console.Writeline((string)(field.GetValue(null)));