たとえば、次のコードスニペットを考えてください。
Contract.Requires<CustomException>(arg !=null)
実行時に、次のコードはtypeの例外をスローしますCustomException
。コードコントラクトはActivatorを使用してのインスタンスを作成しますか。CustomException
それともどうやって使うのですか。私は私のコードにも同様のものを他の目的のためにも実装したいと思います。
によるマイクロソフトの参照資料あなたが参照するメソッドは、次のように実装されています。
public static void Requires<TException>(bool condition) where TException : Exception
{
AssertMustUseRewriter(ContractFailureKind.Precondition, "Requires<TException>");
}
お分かりのように、ジェネリックに機能的な関連はありません。TException
型パラメータそれの訳はccrewrite.exe
コンパイル後にこれを処理します。
2番目の質問に関しては、常に2つの異なる方法で特定のタイプのインスタンスを作成できます。
まず、new()
ジェネリック型パラメータに対する制約:
public static void CreateInstance<TClass>() where TClass : new()
{
TClass instance = new TClass();
// ...
}
第二に、リフレクションを使ってActivator
:
public static void CreateInstanceWithReflection<TClass>()
{
TClass instance = Activator.CreateInstance<TClass>();
// ...
}
後者の方法は、たとえば本当のタイプをまだ知らないで、最初にリフレクションでそれを検索したいです。リフレクションを介してインスタンスを作成するには、クラスにパラメータのないコンストラクタを提供する必要があることにも注意してください。そうでない場合は、こちらを参照してください。質問アドバイスのために。