1. ホーム
  2. c#

[解決済み] テンプレート型のC#ジェネリックnew()への引数の渡し方

2022-03-23 10:26:58

質問

リストに追加する際に、そのコンストラクタを介して型Tの新しいオブジェクトを作成しようとしています。

コンパイルエラーになるんだけど。エラーメッセージは

'T': 変数のインスタンスを作成するときに引数を指定できない

しかし、私のクラスはコンストラクタの引数を持っています! どうすればうまくいくのでしょうか?

public static string GetAllItems<T>(...) where T : new()
{
   ...
   List<T> tabListItems = new List<T>();
   foreach (ListItem listItem in listCollection) 
   {
       tabListItems.Add(new T(listItem)); // error here.
   } 
   ...
}

解決方法は?

関数内で汎用型のインスタンスを作成するには、"new"フラグで制約をかける必要があります。

public static string GetAllItems<T>(...) where T : new()

しかし、これはパラメータを持たないコンストラクタを呼び出したい場合にのみ有効です。 ここではそうではありません。 代わりに、パラメータに基づいてオブジェクトを作成するための別のパラメータを提供する必要があります。 最も簡単なのは関数です。

public static string GetAllItems<T>(..., Func<ListItem,T> del) {
  ...
  List<T> tabListItems = new List<T>();
  foreach (ListItem listItem in listCollection) 
  {
    tabListItems.Add(del(listItem));
  }
  ...
}

そして、次のように呼び出すことができます。

GetAllItems<Foo>(..., l => new Foo(l));