【问题标题】:Add items to a list of objects, where the list itself is of type T将项目添加到对象列表中,其中列表本身的类型为 T
【发布时间】:2014-11-24 16:06:04
【问题描述】:
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”成为一个列表?我的意思是,这是可能的(它可以编译),但是如何将对象添加到这些列表中?

【问题讨论】:

  • 如果您致电Get&lt;Exception&gt;(),您期望会发生什么?
  • 这段代码应该做什么?目前还不清楚..
  • 它总是一个列表吗?不同的论点会如何表现?
  • 虽然不清楚你要做什么,但请注意,你可以在参数上使用new() constraint 来允许你做new T() 而不是调用Activator.CreateInstance(),这很远更高效。
  • @Asad:你不能。由于我无法读心,我所能做的就是试图哄骗 OP 告诉我们他想要达到的目标。如果我不知道问题所在,想出工作代码对我来说毫无意义。

标签: c# list generics createinstance


【解决方案1】:

我相信你想要:

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

【讨论】:

  • 可爱!所以所有这些时间我只是一个“我”离开(被投射到列表而不是接口 IList)......我已经删除了“where T:IList”,而是检查了“Get()”中的类型,好吧,细节..谢谢!
  • 这里实际上不需要as 强制转换,因为list 已经是必须实现IList 的类型的实例。
【解决方案2】:

如果您的T 总是应该具有添加整数的能力,那么您实质上是说它实现了ICollection&lt;int&gt;。添加 ICollection&lt;int&gt; 作为类型约束后,您应该可以很容易地做到这一点:

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

【讨论】:

    【解决方案3】:

    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;
            }
    

    【讨论】:

    • 这只是写new List&lt;int&gt; { 1, 2 }的复杂方式(可以推广到其他类型就好了)。我知道 OP 正在做什么似乎也不必要地复杂,但即便如此,如果这是解决任何问题的方法,问题就出在问题上。
    • :) 如果问题是直截了当的,那么答案也很简单
    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多