Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing arguments to C# generic new() of templated type

I'm trying to create a new object of type T via its constructor when adding to the list.

I'm getting a compile error: The error message is:

'T': cannot provide arguments when creating an instance of a variable

But my classes do have a constructor argument! How can I make this work?

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.    }     ... } 
like image 493
LB. Avatar asked May 08 '09 15:05

LB.


1 Answers

In order to create an instance of a generic type in a function you must constrain it with the "new" flag.

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

However that will only work when you want to call the constructor which has no parameters. Not the case here. Instead you'll have to provide another parameter which allows for the creation of object based on parameters. The easiest is a function.

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

You can then call it like so

GetAllItems<Foo>(..., l => new Foo(l)); 
like image 186
JaredPar Avatar answered Oct 11 '22 15:10

JaredPar