通用函数添加元素列表

时间:2015-12-09 13:59:16

标签: c# generics

我想用一个通用函数AddQuickElement替换AddRangeElementAddElement<T>。但是我如何将通用元素添加到List<Base> list。激活器不起作用。或者,没有反思的更好的方法是什么?

namespace ConsoleApplication
{
class Program
{
    static void Main(string[] args)
    {
        List<Base> list = new List<Base>();
        AddQuickElement(list,5);
        AddRangeElement(list, 5);
        AddElement<Quick>(list,5);
        Console.WriteLine(list.Count);
        Console.ReadKey();
    }
    public static void AddQuickElement(List<Base> list, int number)
    {
        for (int i = 0; i < number; i++)
        {
            list.Add(new Quick());
        }
    }
    public static void AddRangeElement (List<Base> list, int number)
    {
        for (int i = 0; i < number; i++)
        {
            list.Add(new Range());
        }
    }
    public static void AddElement<T>(List<Base> list, int number)
    {
        Type type = typeof(T);
        var element = Activator.CreateInstance(type);
        // list.Add(element); // do not work
    }
}
public abstract class Base
{

}

public class Quick:Base
{

}

public class Range : Base
{

}
}

1 个答案:

答案 0 :(得分:3)

您需要将类型参数约束为AddElement方法

public static void AddElement<T>(List<Base> list, int number) where T : Base, new()
{
    for (int i = 0; i < number; i++)
    {
        list.Add(new T());
    }
}

类型约束where T : Base, new()表示类型T

  1. 源自Base
  2. 有一个公共无参数构造函数。
  3. (1)允许您将T的实例添加到List<Base>,(2)允许您使用T创建new T()的新实例。