C# 通过反射设置静态字段是否保证调用类型初始值设定项?

C# 通过反射设置静态字段是否保证调用类型初始值设定项?,c#,C#,下面的代码设置静态字段的值,并调用初始化器静态构造函数 public class Foo { static Foo() { Console.WriteLine("Initialized"); } public static string Bar; } static Program() { FieldInfo fld = typeof(Foo).GetField("Bar"); fld.SetValue(null, ""); //

下面的代码设置静态字段的值,并调用初始化器静态构造函数

public class Foo
{
    static Foo()
    {
        Console.WriteLine("Initialized");
    }
    public static string Bar;
}

static Program()
{
    FieldInfo fld = typeof(Foo).GetField("Bar");
    fld.SetValue(null, ""); // cctor gets called
}
这会一直发生吗;通过反射设置静态字段是否可以保证静态构造函数在尚未运行的情况下运行?

如果您访问该类的任何成员,运行时将自动为您调用静态构造函数

也就是说,如果静态构造函数还没有运行,它将运行,这是反射的优点之一

您不必直接初始化它,只需访问它的属性即可。 这也会起作用:

Type myClass = typeof(MyClass);
myClass.GetField("SomeValue").GetValue(null);
如果确实要显式调用它,可以使用以下方法:

myClass.TypeInitializer.Invoke(null, null);

尽管这不是一个好的实践,也不推荐使用,但我强烈建议您不要这样做,因为它违反了一种只希望静态构造函数执行一次的类型。

是的,它总是有保证的。实施不太可能改变,因为这肯定是一个重大的突破性改变。