将项添加到列表T通用方法

时间:2017-08-02 05:06:28

标签: c# .net generics

我不确定即使这是可能的,但在这里问题我正在尝试将项目添加到List<T>,如下所示

public static SelectList  ToSelectList<T>(List<T> addlist) where T : new ()
{
    addlist.Insert(0, new T { Id = -1, Name = "SELECT" });
    var list = new SelectList(addlist, "Id", "Name");
    return list;                
}

new T { Id = -1, Name = "SELECT" }投掷错误是否可以将项目添加到List<T>

2 个答案:

答案 0 :(得分:3)

问题在于,通过通用约束,您已将T声明为具有默认构造函数的任何对象。

编译器在编译时执行类型检查,并且T不一定具有属性IdName

解决方案是

  • 创建一个具有IdName
  • 的界面
  • 修改每个兼容的类,使其实现此接口。
  • 为您的函数添加另一个通用约束,需要type参数来实现此接口。

编译示例:

public interface IEntity
{
    int Id {get; set; }
    string Name {get; set; }
}

class Widget : IEntity 
{
    public int Id {get; set; }
    public string Name {get; set; }    

    public string SomeOtherProperty { get; set; }
}

public static SelectList  ToSelectList<T>(List<T> addlist) where T : IEntity, new ()
{
    addlist.Insert(0, new T { Id = -1, Name = "SELECT" });
    var list = new SelectList(addlist, "Id", "Name");
    return list;

}

// In your code
List<Widget> widgetList = new List<Widget>();
ToSelectList(widgetList);

答案 1 :(得分:2)

您的代码存在的问题是您不知道T是什么以及它具有哪些属性。 new不足以作为您的通用约束。所有它都指定了它:

  

新约束指定泛型类声明中的任何类型参数都必须具有公共无参数构造函数

如果您想要实例化T类型的对象,请参阅:Create instance of generic type?

但更好的方法是创建一个包含这些属性的接口,指定您的函数获取该类型的列表,然后实例化该类型的对象:

public static SelectList ToSelectList(List<YourInterface> addlist)
{
    addlist.Insert(0, new YourDerived { Id = -1, Name = "SELECT" });
    var list = new SelectList(addlist, "Id", "Name");
    return list;    
}