gpt4 book ai didi

c# - C# 中的 Cast 删除实现的成员数组

转载 作者:太空宇宙 更新时间:2023-11-03 18:06:12 25 4
gpt4 key购买 nike

考虑:

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

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

class OrderItem {}

class SalesOrderItem : OrderItem {}

尝试转换时

SalesOrder salesorder = new SalesOrder();
salesorder.OrderItems = List<SalesOrderItem>();
salesorder.OrderItems.Add(new SalesOrderItem());
Order order = salesorder;

order.Orderitems 为空。有什么方法可以让这个类型转换与派生属性一起使用吗?

我已经尝试过与接口(interface)的协变,但是不能使用 List 并且使用 IEnumerable 将不允许公共(public) setter 。关于如何实现这一点有什么想法吗?

最佳答案

这就是所谓的“shadowing”。

您的 salesOrder 有两个 OrderItems 属性 - 一个只对 SalesOrder 可见,一个只对 Order< 可见s。子类中的 OrderItems 属性隐藏了父类中的属性。您正在向一个项目添加一个项目,然后观察另一个项目。

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

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

class SalesOrder : Order { }

class OrderItem {}

class SalesOrderItem : OrderItem {}

另一种选择是使 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 {}
SalesOrder salesorder = new SalesOrder();
salesorder.OrderItems.Add(new SalesOrderItem());
Order<SalesOrderItem> order = salesorder;

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

关于c# - C# 中的 Cast 删除实现的成员数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29128590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com