テンプレート型のC#ジェネリックnew()に引数を渡す 質問する

テンプレート型のC#ジェネリックnew()に引数を渡す 質問する

リストに追加するときに、コンストラクターを介して 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.
   } 
   ...
}

ベストアンサー1

関数内でジェネリック型のインスタンスを作成するには、「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));

おすすめ記事