如何使用reflection调用静态构造函数?

如何获取静态构造函数的ConstructorInfo

 public class MyClass { public static int SomeValue; static MyClass() { SomeValue = 23; } } 

我试过以下但失败了….

  Type myClass = typeof (MyClass); // throws exception myClass.TypeInitializer.Invoke(null); // returns null (also tried deleting BindingFlags.Public ConstructorInfo ci = myClass.GetConstructor(BindingFlags.Static|BindingFlags.Public, System.Type.DefaultBinder, System.Type.EmptyTypes, null); // returns empty array ConstructorInfo[] clutchingAtStraws = myClass.GetConstructors(BindingFlags.Static| BindingFlags.Public); 

使用myClass.TypeInitializer.Invoke(null, null)

我刚试过这个并且它工作正常。

但我强烈建议您要这样做 – 它违反了一种类型,期望静态构造函数只执行一次。 如果你只是想确保一个类被初始化,请按照Oliver的回答使用RuntimeHelpers.RunClassConstructor

还有System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type) ,它还保证静态构造函数只被调用一次,无论调用该方法的次数如何:

 Type myClass = typeof(MyClass); System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(myClass.TypeHandle); 

参考

尽管有可能,但这样做可能不是一个好主意。 但是,如果访问该类的任何成员,运行时将自动为您调用静态构造函数。 例如:

 // Read the field 'SomeValue', so that the runtime invokes static ctor Type myClass = typeof(MyClass); myClass.GetField("SomeValue").GetValue(null); 

由于访问类的字段不会导致任何副作用(除了初始化类和调用静态构造函数),这通常是一种相对安全的方法(但是,它只能用于类)用一些静态字段)。 这样做的好处是它可以保证最多只调用一次类型构造函数这非常重要。

您是否也尝试过BindingFlags.Private?

注意,静态构造函数保证在调用任何其他实例或此类的静态方法之前调用get,并且保证它是线程安全的并且只调用一次。

如果你明确地用reflection来调用它,你可能会造成很大的伤害。