我正在制作ASP.NET MVC应用程序,并且我拥有类Order
,但我想在其中添加2个其他属性以供查看。我发现我只会创建一个类ViewOrder
,该类从Order
派生并具有2个其他属性,因此我可以将Order
对象分配给OrderView
,然后设置这2个属性并将此对象传递给查看。
这是正确的方法吗?当我在寻找铸造的答案时,人们给出的例子是“猫从哺乳动物继承而来。不能将哺乳动物铸造为猫,因为它可能是狗”或类似的东西。
列表:
var orderList = new List<Order>(_context.Orders)
就像无法编译一样:
List<OrderView> orderViewList = (List<OrderView>)orderList;
此编译但抛出“ InvalidCastException”:
var orderViewList = orderList.Cast<OrderView>().ToList();
答案 0 :(得分:1)
可能最简单的解决方案是执行显式映射操作:
List<Order> orderList = new List<Order>(_context.Orders);
List<OrderView> orderViewList = new List<OrderView>(); // Empty.
foreach (Order order in orderList)
{
OrderView orderView = new OrderView;
orderView.OrderNo = order.OrderNo;
orderView.CustomerId = order.CustomerId;
// ... etc
orderViewList.Add(orderView);
}
答案 1 :(得分:1)
您不能将基类转换为派生类,没有内置方法。您可以编写可以进行转换的构造函数OrderView(Order)并使用Linq使它看起来干净。
// OrderView constructor
public OrderView(Order order)
{
this.OrderNo = order.OrderNo;
}
// Linq to create new list
List<OrderView> orderView = orders.Select(o => new OrderView(o));
或以这种方式使用它,但不推荐
List<Order> orders = new List<OrderView>();
答案 2 :(得分:0)
我必须为上一个答案道歉。问题出在这里:
List<OrderView> orderViewList = (List<OrderView>)orderList; //<== Casting
真实的事实是:Order
是Orderview
的父代。因此,您无法创建父项并将其分配给子项。您只能创建一个孩子并将其分配给父母。
因此,OrderView
是Order
的另一个版本。但是Order
不是OrderView
的版本。
以下是一个详尽的示例:
将子级分配给父级时,将忽略该父级没有该子级具有的任何其他功能。但是,当将父级分配给子级时,父级需要子级所需的功能。会导致投放问题。
我不确定您打算做的事情是否能长期为您服务,但是可能会有更好的方法来做到这一点。请提供您的Order
类,并确定您特别想通过OrderView
实现的目标。因为据我所知,OrderView
应该是Order
中的一种方法,它提供了Order
的表示形式,因此您可以简单地创建您提到为私有字段的那些额外字段,以便可以使用他们来创建此OrderView()
方法。