强制类加载
在C#或.net IL中是否有一种方法可以强制一个具有类型初始化器(静态构造函数)的类来加载自身,而无需访问它的任何参数?
假设我上了课
public static class LogInitialization { static LogInitialization() { System.Console.WriteLine("Initialized"); } }
有没有办法让这条线印刷?
请注意,该类是静态的,因此我无法将其实例化以强制初始化,并且它没有公共成员,因此我无法访问它们以启动它。
在CLI规范中发现了一个RuntimeHelpers.RunClassConstructor
,我找到了一个方法RuntimeHelpers.RunClassConstructor
的引用
如果一种语言希望提供更严格的行为 – 例如,类型初始化会自动触发基类初始化程序的执行,从上到下依次 – 那么它可以通过以下任一方式执行:
- 在每个类构造函数中定义隐藏的静态字段和代码,它们接触其基类的隐藏静态字段和/或它实现的接口,或者
- 通过显式调用
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor
(请参阅分区IV)。
我通常在具有静态构造函数的类上创建一个虚拟(空)Init方法,以强制执行静态构造函数。 即。
public static void Initialize() { // this will force your static constructor to execute, obviously }
也就是说,你总是可以使用reflection来获取Type.TypeInitializer … http://msdn.microsoft.com/en-us/library/system.type.typeinitializer.aspx
编辑:我过去做过的另一件事是创建一个名为RequiresInitializationAttribute的属性然后在AssemblyLoad上扫描程序集以查找具有这种属性的类型,并使用type.TypeInitializer强制静态构造函数在包含程序集时执行加载。
我想像往常一样,真正的问题是……你想要完成什么?