簡體   English   中英

將項目添加到列表T通用方法

[英]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不必具有屬性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);

代碼的問題在於您不知道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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM