この記事では、C# でパラメーター化されたコンストラクターを使用してジェネリック型をインスタンス化する方法について説明します。
フルーツ マネージャーにフルーツを追加するための一般的なメソッドがあるとします。
<code class="language-csharp">public void AddFruit<T>() where T : BaseFruit { BaseFruit fruit = new T(weight); // 例如:new Apple(150) fruit.Enlist(fruitManager); }</code>
ここで、BaseFruit
クラスには、パラメータとして整数 weight
を取るコンストラクターがあります。
質問: この汎用メソッドで特定の重みを持つフルーツ オブジェクトをインスタンス化できますか?
答え: はい、ただし例のように直接ではありません。 2 つの方法があります:
1. Activator クラスを使用します:
Activator
クラスを使用すると、タイプ T
のオブジェクトを動的にインスタンス化し、必要なパラメーターをオブジェクトの配列として渡すことができます。
<code class="language-csharp">return (T)Activator.CreateInstance(typeof(T), new object[] { weight });</code>これには、コンパイラーがチェックするためのパラメーターのないパブリック コンストラクターが
クラスに必要であることに注意してください。ただし、実際には、BaseFruit
クラスを使用してインスタンスを作成します。 Activator
2. コンストラクターで汎用パラメーターを使用します:
C# では、ジェネリック型をインスタンス化するためにパラメーターを必要とするコンストラクターの使用が制限されています。回避策として、型と同じ名前のジェネリック パラメーターを作成し、その定義でコンストラクター パラメーターを指定できます。ただし、このアプローチは、ジェネリック型のコンストラクター要件に関連するコード臭が発生する可能性があるため、一般的に推奨されません。
<code class="language-csharp">public void AddFruit<T>(T fruit) where T : new(int weight) { fruit.Enlist(fruitManager); } // 使用示例: AddFruit(new Apple(150));</code>
以上がパラメーター化されたコンストラクターを含むジェネリック型を C# でインスタンス化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。