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