你如何使用泛型在基类上使用foreach?

Cri*_*spy 2 c# generics foreach inheritance

这个问题是尝试Jon Skeet对这个问题的回答的结果.

所以我在上面的问题链接的问答中有以下代码.

 public abstract class DeliveryStrategy { }
public class ParcelDelivery : DeliveryStrategy { }
public class ShippingContainer : DeliveryStrategy { }

public abstract class Order<TDelivery> where TDelivery : DeliveryStrategy
{
    private TDelivery delivery;

    protected Order(TDelivery delivery)
    {
        this.delivery = delivery;
    }

    public TDelivery Delivery
    {
        get { return delivery; }
        set { delivery = value; }
    }
}

public class CustomerOrder : Order<ParcelDelivery>
{
    public CustomerOrder()
        : base(new ParcelDelivery())
    { }
}

public class OverseasOrder : Order<ShippingContainer>
{
    public OverseasOrder() : base(new ShippingContainer())
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试更多地理解泛型来提高我的技能,所以我有一个问题:现在我如何使用foreach循环遍历"订单"集合?我正在使用C#2.0.

代码示例我正在尝试做什么(不编译).

List<Order> orders = new List<Order>();

orders.Add(new CustomerOrder());
orders.Add(new CustomerOrder());
orders.Add(new OverseasOrder());
orders.Add(new OverseasOrder());

foreach (Order order in orders)
{
     order.Delivery.ToString();
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加了OverseasOrder以提供更好的示例.

ang*_*son 6

这里的问题是,订单是一个通用类,所以Order<T>并Order基本上是两种截然不同的类型.

你可以这样做:

public abstract class Order
{
    public abstract String GetDeliveryMethod();
}

public abstract class Order<TDelivery> : Order
    where TDelivery : DeliveryStrategy
{
    .... the rest of your class

    public override String GetDeliveryMethod()
    {
        return Delivery.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者......您可以将Order重新定义为非泛型,在这种情况下,您将失去一些强类型.