Type.TypeInitializerプロパティを参照すると静的コンストラクタ(クラスコンストラクタ)のConstructorInfoを取得することができます。 (BindingFlags.Static
とBindingFlags.NonPublic
を指定してGetConstructorメソッドを呼び出しても静的コンストラクタを取得することができます)
通常、静的コンストラクタは自動的に一度だけ呼び出されるのみで、ユーザーコードからは呼び出すことはできませんが、TypeInitializerプロパティから取得したConstructorInfoを使うことで静的コンストラクタを任意のタイミングで呼び出すことができます。
Type.TypeInitializerプロパティから静的コンストラクタを取得して呼び出す
using System;
using System.Reflection;
class C {
// 静的コンストラクタ
static C()
{
Console.WriteLine("initialized");
}
}
class Sample {
static void Main()
{
var t = typeof(C);
// 静的コンストラクタのConstructorInfoを取得する
var cctor = t.TypeInitializer;
Console.WriteLine(cctor);
// 静的コンストラクタを呼び出す
cctor.Invoke(null, null);
}
}
実行結果
Void .cctor() initialized initialized
実行結果からも分かるとおり、静的コンストラクタが自動的に呼び出された分と、ConstructorInfoを使って呼び出した分の二回分が表示されています。 つまり、ConstructorInfoを使って静的コンストラクタを呼び出したことにより、クラスが再初期化されたことになります。
ほとんどの場合、このような再初期化を行う必要性はありません。 そもそも、静的コンストラクタは通常、型の初期化時に一度だけ呼び出されることを前提とした実装となっていることが多いことから、それ以外のタイミングで静的コンストラクタを呼び出すことはクラスの状態の破壊・不整合を引き起こす可能性があるため、そういった操作の安全性が明確に保証されている場合以外では、すべきではありません。