在泛型约束中通过构造函数传递参数

时间:2015-12-09 14:47:53

标签: c# generics type-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;
    }
}
}

2 个答案:

答案 0 :(得分:4)

通常的做法是将工厂方法或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类中使用它,如下所示:

var baseList = new List<Base>();
AddElement(baseList, 5, () => new Quick(1));

如果您希望能够在int内传递AddElement<T>()构造函数参数,则可以使用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));

答案 1 :(得分:0)

不,你只能使用具有无参数的构造函数的类型(T)。来自MSDN

  

type参数必须具有公共无参数构造函数。