将参数传递给模板类型的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.
   } 
   ...
}

为了在一个函数中创建一个泛型类型的实例,你必须用“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));

在.Net 3.5中,然后你可以使用激活器类:

(T)Activator.CreateInstance(typeof(T), args)

由于没有人打扰张贴'反思'的答案(我个人认为这是最好的答案),下面是:

public static string GetAllItems<T>(...) where T : new()
{
   ...
   List<T> tabListItems = new List<T>();
   foreach (ListItem listItem in listCollection) 
   {
       Type classType = typeof(T);
       ConstructorInfo classConstructor = classType.GetConstructor(new Type[] { listItem.GetType() });
       T classInstance = (T)classConstructor.Invoke(new object[] { listItem });

       tabListItems.Add(classInstance);
   } 
   ...
}

编辑:由于.NET 3.5的Activator.CreateInstance,此答案已被弃用,但它在旧版.NET中仍然有用。

链接地址: http://www.djcxy.com/p/79167.html

上一篇: Passing arguments to C# generic new() of templated type

下一篇: GUI architecture design resources?