C# ジェネリック型のインスタンス化とコンストラクター パラメーター
ジェネリック型を構築するときの一般的な質問は、「ジェネリック メソッドでパラメーターを必要とするコンストラクターをインスタンス化するにはどうすればよいですか?」というものです。たとえば、BaseFruit
クラスには、整数型の重みパラメーターを受け取るコンストラクターがあります。
ジェネリックメソッドで指定された重みを持つフルーツをインスタンス化するにはどうすればよいですか?
次のコードは、ジェネリック メソッドで指定された重みを持つフルーツ インスタンスを作成しようとします:
<code class="language-csharp">public void AddFruit<T>() where T : BaseFruit { BaseFruit fruit = new T(weight); /*new Apple(150);*/ fruit.Enlist(fruitManager); }</code>
このアプローチは、BaseFruit
にパラメーターのないコンストラクターがあり、その後メンバー変数を介してプロパティを変更する場合にのみ可能です。ただし、実際のアプリケーションでは、これは現実的ではない可能性があります。
代替:
は Activator
クラスを使用できます:
<code class="language-csharp">return (T)Activator.CreateInstance(typeof(T), new object[] { weight });</code>
この場合、T
の new()
制約により、コンパイル時にパラメーターのないパブリック コンストラクターが存在することが保証され、Activator
クラスが実際の型の作成を担当します。
注:
このシナリオは回避策を提供しますが、コード内で特定のコンストラクターの存在を確認する必要があります。さらに、このアプローチに依存すると、コード レベルで問題が発生する可能性があるため、現在のバージョンの C# では回避する必要があります。
以上がジェネリック型のインスタンス化は C# のコンストラクター引数を処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。