なぜこれが機能するのかはわかりませんが、静的クラスがある場合は( Skeetの助けを借りて)推論します
public static class Statics1
{
public static string Value1 { get; set; }
static Statics1()
{
Console.WriteLine("Statics1 cctor");
Value1 = "Initialized 1";
}
}
コード:
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null);
or
staticType.TypeInitializer.Invoke(new object[0]);
どういうわけかこれはクラスの.cctorではなく.ctorに解決されるため、例外を除いてスローします。
明示的に静的なクラスを使用する場合、それは抽象シールされたクラスのように扱われるため、抽象クラスをインスタンス化できないという例外があります。静的コンストラクターで通常のクラスを使用する場合、例外は型初期化子がそうではないということです。呼び出し可能。
しかし、次のように2つのパラメーター(インスタンス、パラメーター)でInvokeオーバーロードを使用する場合:
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);
静的メソッド(最初のnullの意味-インスタンスなし== static)を呼び出していることを明示的に示すと、これは機能し、クラスを初期化します。
とはいえ、静的コンストラクターは奇妙な獣です。この方法で呼び出すと、静的コンストラクターがすでに実行されている場合でも呼び出されます。つまり、次のコードです。
Console.WriteLine(Statics1.Value1);
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);
静的コンストラクターを2回呼び出します。したがって、cctorにファイルの作成、データベースのオープンなどの潜在的に重要な副作用がある場合は、このアプローチを再考することをお勧めします。
また、読みやすさの理由から静的コンストラクターを好みますが、パフォーマンスの観点から、フィールド初期化子は静的コンストラクターよりも少し高速です。