Объедините полиморфные списки в один список и получите производный тип - PullRequest
3 голосов
/ 22 февраля 2012

Не знаю, правильно ли я спрашиваю, но вот что я хочу сделать:

Модель

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(), но я был бы очень признателен за пример эксперта по этому вопросу.

Ответы [ 2 ]

8 голосов
/ 22 февраля 2012

Да, 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();
}
1 голос
/ 22 февраля 2012

В дополнение к предлагаемым решениям, вы могли бы рассмотреть это, что несколько более чистый код:

var result = new List<IncomingOrderBase>(ProductOrders);
result.AddRange(ServiceOrders);
return result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...