如何将List <Parent>分配给具有两个附加属性的父级扩展的List <Child>?

时间:2019-12-07 16:04:10

标签: c# asp.net asp.net-mvc

我正在制作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();

3 个答案:

答案 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

真实的事实是:OrderOrderview的父代。因此,您无法创建父项并将其分配给子项。您只能创建一个孩子并将其分配给父母。

因此,OrderViewOrder的另一个版本。但是Order不是OrderView的版本。

以下是一个详尽的示例:

将子级分配给父级时,将忽略该父级没有该子级具有的任何其他功能。但是,当将父级分配给子级时,父级需要子级所需的功能。会导致投放问题。

我不确定您打算做的事情是否能长期为您服务,但是可能会有更好的方法来做到这一点。请提供您的Order类,并确定您特别想通过OrderView实现的目标。因为据我所知,OrderView应该是Order中的一种方法,它提供了Order的表示形式,因此您可以简单地创建您提到为私有字段的那些额外字段,以便可以使用他们来创建此OrderView()方法。