如何获取ConstructorInfo静态构造函数?
public class MyClass
{
public static int SomeValue;
static MyClass()
{
SomeValue = 23;
}
}
Run Code Online (Sandbox Code Playgroud)
我试过以下但失败了....
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);
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 31
使用myClass.TypeInitializer.Invoke(null, null).
我刚试过这个,它运行正常.
但我强烈建议您不要这样做 - 它违反了一种类型,期望静态构造函数只执行一次.如果你只是想确保一个类被初始化,请RuntimeHelpers.RunClassConstructor按照Oliver的答案使用.
Oli*_*ver 31
还有,它还System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type)保证静态构造函数只被调用一次,无论调用该方法的次数如何:
Type myClass = typeof(MyClass);
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(myClass.TypeHandle);
Run Code Online (Sandbox Code Playgroud)
尽管有可能,但这样做可能不是一个好主意.但是,如果访问该类的任何成员,运行时将自动为您调用静态构造函数.例如:
// Read the field 'SomeValue', so that the runtime invokes static ctor
Type myClass = typeof(MyClass);
myClass.GetField("SomeValue").GetValue(null);
Run Code Online (Sandbox Code Playgroud)
因为访问类的字段不会导致任何副作用(除了初始化类和调用静态构造函数),这通常是一种相对安全的方法(但是,它只能用于类)用一些静态字段).这样做的好处是它可以保证最多只调用一次类型构造函数,这非常重要.
| 归档时间: |
|
| 查看次数: |
6531 次 |
| 最近记录: |