将项添加到对象列表中,其中列表本身为T类型

时间:2014-11-24 16:06:05

标签: c# list generics createinstance

private void Call()
{
    List<int> numbers= Get<List<int>>();
    MessageBox.Show("Numbers amount " + numbers.Count);
}

private T Get<T>() 
{
    T list = Activator.CreateInstance<T>();
    int a = 1;
    //HOW TO ADD "A" TO THE T-object [which is a list...]?
    return list;
}

是否可以让“T”成为一个列表?我的意思是,它可能(它编译),但是如何将对象添加到这些列表中呢?

3 个答案:

答案 0 :(得分:1)

我相信你想要:

private static T Get<T>() where T : IList
{
    T list = Activator.CreateInstance<T>(); 
    int a = 1;
    (list as IList).Add(a);
    return list;
}

答案 1 :(得分:0)

如果你的T总是应该能够添加整数,那么你实际上说的是它实现了ICollection<int>。将ICollection<int>添加为类型约束后,您应该可以非常轻松地执行此操作:

private T Get<T>() where T: ICollection<int>, new
{
    T coll = new T();
    int a = 1;

    coll.Add(a);
    return coll;
}

如上所述in the comments,您也可以避免使用Activator.CreateInstance,因为您不需要任何构造函数参数。

现在你可以使用:

var myList = Get<List<int>>();
Console.WriteLine(myList.Count); // Should be 1

以下是演示:http://ideone.com/0pjFoJ

答案 2 :(得分:0)

Asad说,但是如果你想要一个通用的方法来获取一个列表,我会建议调用GetList并执行以下操作(注意添加是在lambda中完成的,这样你可以添加你想要的任何东西或提供一个函数这样做):

private void Call()
        {
            List<int> numbers = GetList<int>(l =>
            {
                l.Add(1);
                l.Add(2);
                //etc
            });
            MessageBox.Show("Numbers amount " + numbers.Count);
        }

        private List<T> GetList<T>(Action<List<T>> initList)
        {
            List<T> list = Activator.CreateInstance<List<T>>();
            initList(list);
            return list;
        }