在泛型约束中通过构造函数传递参数
Pass parameter through constructor in generic constraints
我想将构造函数中的参数传递给具有约束的泛型函数。是否可以使用参数创建 T
的实例?类似于 list.Add(new T(1));
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
List<Base> list = new List<Base>();
AddElement<Quick>(list,5);
AddElement<Range>(list, 5);
Console.WriteLine(list.Count);
Console.ReadKey();
}
public static void AddElement<T>(List<Base> list, int number) where T : Base, new ()
{
for (int i = 0; i < number; i++)
{
//do not working
list.Add(new T(i));
}
}
}
public abstract class Base
{
}
public class Quick:Base
{
private int ID;
public Quick()
{
}
public Quick(int ID)
{
this.ID = ID;
}
}
public class Range : Base
{
private int ID;
public Range()
{
}
public Range(int ID)
{
this.ID = ID;
}
}
}
不,您只能对具有无参数构造函数的类型 (T
) 执行此操作。来自 MSDN:
The type argument must have a public parameterless constructor.
解决此问题的通常方法是将工厂方法或 Func<T>
传递给方法:
public static void AddElement<T>(List<Base> list, int number, Func<T> factory) where T : Base
{
for (int i = 0; i < number; i++)
{
list.Add(factory());
}
}
您可以像这样在 Quick
class 中使用它:
var baseList = new List<Base>();
AddElement(baseList, 5, () => new Quick(1));
如果您希望能够在 AddElement<T>()
中传递 int
构造函数参数,您可以使用 Func<int, T>
代替,如下所示:
public static void AddElement<T>(List<Base> list, int number, Func<int, T> factory) where T : Base
{
for (int i = 0; i < number; i++)
{
list.Add(factory(i));
}
}
然后这样称呼它:
var baseList = new List<Base>();
AddElement(baseList, 5, x => new Quick(x));
我想将构造函数中的参数传递给具有约束的泛型函数。是否可以使用参数创建 T
的实例?类似于 list.Add(new T(1));
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
List<Base> list = new List<Base>();
AddElement<Quick>(list,5);
AddElement<Range>(list, 5);
Console.WriteLine(list.Count);
Console.ReadKey();
}
public static void AddElement<T>(List<Base> list, int number) where T : Base, new ()
{
for (int i = 0; i < number; i++)
{
//do not working
list.Add(new T(i));
}
}
}
public abstract class Base
{
}
public class Quick:Base
{
private int ID;
public Quick()
{
}
public Quick(int ID)
{
this.ID = ID;
}
}
public class Range : Base
{
private int ID;
public Range()
{
}
public Range(int ID)
{
this.ID = ID;
}
}
}
不,您只能对具有无参数构造函数的类型 (T
) 执行此操作。来自 MSDN:
The type argument must have a public parameterless constructor.
解决此问题的通常方法是将工厂方法或 Func<T>
传递给方法:
public static void AddElement<T>(List<Base> list, int number, Func<T> factory) where T : Base
{
for (int i = 0; i < number; i++)
{
list.Add(factory());
}
}
您可以像这样在 Quick
class 中使用它:
var baseList = new List<Base>();
AddElement(baseList, 5, () => new Quick(1));
如果您希望能够在 AddElement<T>()
中传递 int
构造函数参数,您可以使用 Func<int, T>
代替,如下所示:
public static void AddElement<T>(List<Base> list, int number, Func<int, T> factory) where T : Base
{
for (int i = 0; i < number; i++)
{
list.Add(factory(i));
}
}
然后这样称呼它:
var baseList = new List<Base>();
AddElement(baseList, 5, x => new Quick(x));