c# - 将多态列表合并为一个列表并获取派生类型

标签 c# .net generics inheritance polymorphism

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

型号

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() 让它工作了,但我真的很感谢专家的例子。

最佳答案

是的,Concat是你想要的:

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

请注意,这仅适用于 .NET 4,它具有 IEnumerable<T> 的通用协方差.如果您使用的是 .NET 3.5,则需要

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

关于c# - 将多态列表合并为一个列表并获取派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385012/

相关文章:

c# - 调用 C# 方法,并使其在 10 秒后返回

c# - XNA:从 Matrix 获取 Vector3

c# - 从 IClientMessageInspector 登录时屏蔽敏感信息

c# - 根据 YYYYMMDD 等格式化 .NET DateTime 的最简单方法是什么?

java - 接收通用类类型

c# - C#中从基类调用重写的方法

c# - 多线程 Outlook Application.ItemSend 事件?

c# - 更改成员资格连接字符串

generics - typescript :实现通用接口(interface)

Java反射: getting correct type of parameterized generic superclass method