12

C# 或 .net IL 中是否有办法强制具有类型初始值设定项(静态构造函数)的类加载自身,而不访问其任何参数?

假设我有课

public static class LogInitialization {
    static LogInitialization() {
        System.Console.WriteLine("Initialized");
    }
}

有没有办法让这条线打印?

请注意,该类是静态的,因此我无法实例化它来强制初始化,并且它没有公共成员,因此我无法访问它们来启动它。

4

2 回答 2

13

在 CLI 规范中翻找,我找到了对该方法的引用RuntimeHelpers.RunClassConstructor

如果一种语言希望提供更严格的行为——例如,类型初始化自动触发基类的初始化程序的执行,以从上到下的顺序——那么它可以通过以下方式做到这一点:

  • 在每个触及其基类的隐藏静态字段和/或它实现的接口的类构造函数中定义隐藏的静态字段和代码,或
  • 通过显式调用System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (参见第 IV 部分)。
于 2010-11-15T05:33:38.097 回答
7

我通常在具有静态构造函数的类上创建一个虚拟(空)Init 方法来强制执行静态构造函数。IE。

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 在包含程序集时强制执行静态构造函数加载。

我想像往常一样,真正的问题是......你想要完成什么?

于 2010-11-15T05:20:57.430 回答