ホームページ >バックエンド開発 >C++ >パラメーター化されたコンストラクターを含むジェネリック型を C# でインスタンス化できますか?

パラメーター化されたコンストラクターを含むジェネリック型を C# でインスタンス化できますか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-09 12:17:41778ブラウズ

C# のジェネリック型とパラメーター化されたコンストラクターのインスタンス化

この記事では、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。