ジェネリック型を受け入れるジェネリック メソッドがあり、特定のコンストラクター パラメーターを使用してその型のインスタンスをインスタンス化するとします。ただし、型のコンストラクターにはパラメーターが必要なので、それができるかどうかはわかりません。
次のコード スニペットは、ジェネリック メソッドでフルーツ オブジェクトを作成する試みを示しています。
<code class="language-csharp">public void AddFruit<T>() where T : BaseFruit { BaseFruit fruit = new T(weight); /*new Apple(150);*/ fruit.Enlist(fruitManager); }</code>
BaseFruit
にはパラメーターのないコンストラクターがないため、このアプローチは失敗する可能性があります。果物の重さを指定するには整数パラメータを受け取ります。
この問題を解決するために、C# は Activator
クラスを提供します。 Activator.CreateInstance
メソッドを使用して型のインスタンスを作成し、オブジェクトの配列をコンストラクター引数として渡すことができます:
<code class="language-csharp">return (T)Activator.CreateInstance(typeof(T), new object[] { weight });</code>
T
で new()
制約を使用すると、コンパイラーがコンパイル時にパラメーターのないパブリック コンストラクターをチェックするだけであることに注意してください。型の作成に使用される実際のコードは、Activator
クラスによって処理されます。
このアプローチでは、パラメーター化されたコンストラクターを使用して型をインスタンス化できますが、特定のコンストラクターが型定義に存在することを確認する必要があります。このアプローチに依存すると、潜在的なコードの匂いが示され、他の設計オプションを検討する必要があることが示唆される場合があります。
以上がC# でパラメーター化されたコンストラクターを使用してジェネリック型をインスタンス化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。