ホームページ >バックエンド開発 >C++ >C# でジェネリック型をインスタンス化するときにコンストラクターに引数を渡すにはどうすればよいですか?

C# でジェネリック型をインスタンス化するときにコンストラクターに引数を渡すにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-22 13:46:10380ブラウズ

How Can I Pass Arguments to a Constructor When Instantiating a Generic Type in C#?

C# のジェネリック型にコンストラクターの引数を渡す

C# でパラメーター化されたコンストラクターを使用してジェネリック型のインスタンスを作成すると、課題が生じる可能性があります。 直接インスタンス化を試みると、多くの場合、「変数のインスタンスを作成するときに引数を指定できません」というエラーが発生します。これは、コンパイラがコンパイル時に特定のコンストラクター シグネチャを認識していないためです。

new() 制約ではパラメーターなしのコンストラクターのみが許可されます。引数を持つコンストラクターを処理するには、一般的な解決策として、ファクトリ メソッド (多くの場合デリゲートとして表されます) を使用します。

これを実現する方法は次のとおりです:

ジェネリック型を直接インスタンス化する代わりに、デリゲート (Func など) をジェネリック メソッドに渡します。このデリゲートはファクトリとして機能し、必要なコンストラクター引数を備えたオブジェクトの作成を担当します。

例:

<code class="language-csharp">public static string GetAllItems<T>(..., Func<ListItem, T> factoryMethod) {
  // ...
  List<T> tabListItems = new List<T>();
  foreach (ListItem listItem in listCollection) 
  {
    tabListItems.Add(factoryMethod(listItem));
  }
  // ...
}</code>

この GetAllItems メソッドは Func<ListItem, T> デリゲートを受け入れるようになりました。 このデリゲートは入力として ListItem を受け取り、型 T.

のインスタンスを返します。

使用法:

<code class="language-csharp">GetAllItems<Foo>(..., l => new Foo(l)); </code>

この例では、ラムダ式 l => new Foo(l) がファクトリ メソッドとして機能します。これは ListItem (l) を受け取り、それを使用して Foo のコンストラクターを使用して新しい Foo オブジェクトを作成します。 これにより、ListItem 引数が Foo コンストラクターに効果的に渡されます。

このアプローチでは、オブジェクト作成ロジックをジェネリック メソッド自体から分離することで、パラメーター化されたコンストラクターを含むジェネリック型の柔軟なインスタンス化が可能になります。

以上がC# でジェネリック型をインスタンス化するときにコンストラクターに引数を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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