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