如何获取静态构造函数的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);发布于 2010-03-27 00:33:03
使用myClass.TypeInitializer.Invoke(null, null)。
我刚刚试过了,它工作得很好。
但是,我强烈建议您不要这么做--它违反了静态构造函数只能执行一次的类型。如果您只是想确保某个类已初始化,请按照Oliver's answer的方式使用RuntimeHelpers.RunClassConstructor。
发布于 2015-02-26 17:06:52
还有System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type),它还保证静态构造函数只被调用一次,而不管方法被调用了多少次:
Type myClass = typeof(MyClass);
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(myClass.TypeHandle);发布于 2010-03-27 00:37:56
即使这是可能的,但这样做可能不是一个好主意。但是,如果您访问该类的任何成员,运行库将自动为您调用静态构造函数。例如:
// Read the field 'SomeValue', so that the runtime invokes static ctor
Type myClass = typeof(MyClass);
myClass.GetField("SomeValue").GetValue(null);由于访问类的字段不会导致任何副作用(除了类的初始化和对静态构造函数的调用之外),通常这应该是一种相对安全的方法(但是,它仍然只适用于具有某些静态字段的类)。这样做的好处是它保证了类型构造函数最多被调用一次,这一点非常重要。
https://stackoverflow.com/questions/2524906
复制相似问题