Cast drop在C#中实现了Member数组

Fra*_*lin 1 c# inheritance casting

考虑:

class Order
{
    public List<OrderItem> OrderItems {get;set;}
}

class SalesOrder : Order
{
    public List<SalesOrderItem> OrderItems {get;set;}
}

class OrderItem {}

class SalesOrderItem : OrderItem {}
Run Code Online (Sandbox Code Playgroud)

当试图施放

SalesOrder salesorder = new SalesOrder();
salesorder.OrderItems = List<SalesOrderItem>();
salesorder.OrderItems.Add(new SalesOrderItem());
Order order = salesorder;
Run Code Online (Sandbox Code Playgroud)

order.Orderitems一片空白.有没有办法让这个演员用于派生属性?

我尝试过与界面协方差,但后来不能使用List和使用IEnumerable将不允许公共设置器.有关如何实现这一点的任何想法?

JLR*_*she 5

这就是所谓的" 阴影 ".

salesOrder有两个OrderItems属性 - 一个只对SalesOrders 可见,一个只对Orders 可见.OrderItems子类中的属性将隐藏在父类中的属性.您正在向一个项目添加项目,然后观察另一个项目.

我认为您需要重新考虑您的设计,但是您可以通过从子类中删除属性来解决此问题:

class Order
{
    public Order()
    {
        OrderItems = new List<OrderItem>();
    }
    public List<OrderItem> OrderItems {get;set;}
}

class SalesOrder : Order { }

class OrderItem {}

class SalesOrderItem : OrderItem {}
Run Code Online (Sandbox Code Playgroud)

另一个选择是创建Order一个泛型类:

class Order<T> where T: OrderItem
{
    public Order()
    {
        OrderItems = new List<T>();
    }
    public List<T> OrderItems {get;set;}
}

class SalesOrder : Order<SalesOrderItem> { }

class OrderItem {}

class SalesOrderItem : OrderItem {}
Run Code Online (Sandbox Code Playgroud)
SalesOrder salesorder = new SalesOrder();
salesorder.OrderItems.Add(new SalesOrderItem());
Order<SalesOrderItem> order = salesorder;
Run Code Online (Sandbox Code Playgroud)

第二种方法的好处是它允许OrderItems存储特定类型的订单商品而不是最通用的类​​型.