【问题标题】:Combine Polymorphic Lists into One List and Get Derived Type将多态列表合并为一个列表并获取派生类型
【发布时间】:2012-03-12 04:52:49
【问题描述】:

我不知道我问这个是否正确,但这就是我想做的:

型号

public abstract class IncomingOrderBase
{
    public string Summary { get; set; }
}

public class IncomingProductOrder : IncomingOrderBase
{
    public Product Product { get; set; }
}
public class IncomingServiceOrder : IncomingOrderBase
{
    public Service Service { get; set; }
}

public class Sale
{
    public ICollection<IncomingProductOrder> ProductOrders { get; set; }
    public ICollection<IncomingServiceOrder> ServiceOrders { get; set; }

    public List<IncomingOrderBase> GetAllOrders()
    {
        var orders = this.ProductOrders +++PLUS+++ this.ServicesOrders;
        return orders.ToList();
    }
}

用法

foreach(var order in sale.GetAllOrders())
{
    Console.WriteLine(order.GetType().Name);
    //output = "ProductOrder" or "ServiceOrder" not "IncomingOrderBase"
}

如何将两个(或多个)列表编译为一个列表,然后从结果列表中获取原始(派生)类型?我想我已经使用 Concat() 工作了,但我真的很感谢专家在这方面的例子。

【问题讨论】:

    标签: c# .net generics inheritance polymorphism


    【解决方案1】:

    是的,Concat 就是你想要的:

    public List<IncomingOrderBase> GetAllOrders()
    {
        return ProductOrders.Concat<IncomingOrderBase>(ServicesOrders).ToList();
    }
    

    请注意,这仅适用于具有IEnumerable&lt;T&gt; 的通用协方差的 .NET 4。如果您使用的是 .NET 3.5,则需要

    public List<IncomingOrderBase> GetAllOrders()
    {
        return ProductOrders.Cast<IncomingOrderBase>()
                            .Concat(ServicesOrders.Cast<IncomingOrderBase>())
                            .ToList();
    }
    

    【讨论】:

    • 我认为第二个例子更清晰。除非有一些性能损失,否则我宁愿将它与 .NET 4 一起使用。
    【解决方案2】:

    除了建议的解决方案之外,您还可以考虑以下代码,代码更简洁:

    var result = new List<IncomingOrderBase>(ProductOrders);
    result.AddRange(ServiceOrders);
    return result;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2022-01-07
      • 2020-07-19
      • 1970-01-01
      • 2014-05-16
      • 2014-01-27
      相关资源
      最近更新 更多