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メソッドを作成して、静的コンストラクターの実行を強制します。すなわち。

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

編集:私が過去に行ったもう1つのことは、RequiresInitializationAttributeという属性を作成し、AssemblyLoadでそのような属性を持つ型のアセンブリをスキャンし、type.TypeInitializerを使用して、含まれているアセンブリがロードされました。

いつものように、本当の質問は...何を達成しようとしているのかと思います。

于 2010-11-15T05:20:57.430 に答える