簡體   English   中英

返回通用 C# 的列表

[英]return a list of generic C#

我有一個 singleton class,包含幾個數據列表。 我想要一個 function 根據請求的數據類型返回列表之一

public class Book
{
    public string Name { get; set; }
    public int Pages { get; set; }
}

public class DVD
{
    public string Name { get; set; }
    public TimeSpan Length { get; set; }
}

public class DBReferenceSingleton
{
    private List<Book> _bookList;
    private List<DVD> _dvdList;

    public IEnumerable<Entity> GetEntities<Entity>() where Entity : class
    {
        switch(typeof(Entity).Name)
        {
            case nameof(Book):
                return _bookList;
            case nameof(DVD):
                return _dvdList;
        }
        return null;
    }

這不起作用,因為需要轉換。 我想知道是否有任何優雅的解決方案(不序列化所有元素或實現 IConvertible)?

看起來 generics 似乎不是這里的正確工具; 尤其是因為BookDVD沒有共同的基礎 class。

我認為你應該有兩種方法:

public List<Book> GetBooks() => _bookList;
public List<DVD> GetDvds() => _dvdList;

你試過做演員嗎?

public class Book
{
    public string Name { get; set; }
    public int Pages { get; set; }
}

public class DVD
{
    public string Name { get; set; }
    public TimeSpan Length { get; set; }
}

public class DBReferenceSingleton
{
    private List<Book> _bookList;
    private List<DVD> _dvdList;

    public IEnumerable<Entity> GetEntities<Entity>() where Entity : class
    {
        switch(typeof(Entity).Name)
        {
            case nameof(Book):
                return _bookList as List<Entity>;
            case nameof(DVD):
                return _dvdList as List<Entity>;
        }
        return null;
    }
}

如果 object 類型錯誤,“as List< Entity >”將返回 null,如果類型正確,則返回 object 作為類型。 A = B as C 模式也適用於繼承類型,只要記住檢查 null 返回的值,以防您的類型不像在這種情況下那樣廣為人知

關於在這種情況下使用泛型方法的有用性的旁注:在這種方法中,您每次都被迫顯式設置實體的類型,這意味着您的方法在功能上是非泛型的 - 所以您不妨明確兩個方法。

像您所擁有的通用方法可能更有用的一種情況是,如果 book 和 dvd 都從基礎 class 繼承,並且您有一些后續方法需要從列表中操作。 例如,您可能最終想要在代碼中執行類似的操作:

public class Book : Rentable
{
    public int Pages { get; set; }
}
public class DVD : Rentable
{
    public TimeSpan Length { get; set; }
}
public class Rentable
{
    public string Name { get; set; }
    public string borrowedBy { get; set; }
}
public class DBReferenceSingleton
{
    private List<Book> _bookList;
    private List<DVD> _dvdList;
    public enum RentableType { Book, DVD }
    public IEnumerable<Rentable> GetEntities(RentableType entityType)
    {
        switch (entityType)
        {
            case RentableType.Book:
                return _bookList.ToList<Rentable>();
            case RentableType.DVD:
                return _dvdList.ToList<Rentable>();
            default:
                throw new NotImplementedException($"Entity {entityType} not supported");
        }
        return null;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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