[英]Add Item to List T Generic method
我不確定是否有可能,但是在這里我試圖將項目添加到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>
?
問題在於,通過通用約束,您已將T
聲明為具有默認構造函數的任何對象。
編譯器在編譯時執行類型檢查,並且T不必具有屬性Id
或Name
。
一個解決方案是
Id
和Name
的接口, 一個編譯示例:
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);
代碼的問題在於您不知道T
是什么以及它具有什么屬性。 new
不足以作為您的一般約束。 所有它指定它:
新約束指定通用類聲明中的任何類型參數都必須具有公共的無參數構造函數
如果您想實例化T
類型的對象,請參見: 創建泛型類型的實例? 。
但是最好的辦法是使用這些屬性創建一個接口,指定您的函數獲取該類型的列表,然后實例化該類型的對象:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.