2012-03-26 39 views
14

我在程序中使用对象和集合初始化程序,并考虑如何获取下面的示例。对象和集合初始化程序 - 分配自己?

Orders.Add(new Order() 
       { 
        id = 123, 
        date = new datetime(2012,03,26) 
        items = new OrderItems() 
          { 
          lineid = 1, 
          quantity = 3, 
          order = ?? // want to assign to current order. 
          } 
       } 

如何将新创建的订单分配给订单项目?

+0

您可能需要首先添加OrderItems集合,然后分配订单。或者你也许可以单向关系。 – ashes999 2012-03-26 19:10:50

+1

从建模角度看似有点奇怪。为什么'OrderItem'包含'Order'?我认为'Order'是聚合根,并且包含具有关于这些项目的附加上下文的项目('OrderItem's)。但是这些项目并不需要知道任何关于订单的事情。 – David 2012-03-26 19:11:56

+0

作为一种解决方法,您可以让'item'的setter透明地分配属性,但这对于稍后添加到集合中的'OrderItem's不起作用。 – millimoose 2012-03-26 19:13:15

回答

10

你试图在这里是不可能的。您不能从对象初始值设定项体内引用正在构建的对象。您将需要打破这一成一组独立的步骤

var local = new Order() { 
    id = 123, 
    date = new datetime(2012, 03, 26); 
}; 
local.items = new OrderItems() { 
    lineid = 1; 
    quantity = 3; 
    order = local; 
}; 
Orders.Add(local); 
2

如果Order.items是一个属性,你可以把这样的事情在属性setter

public class Order 
{ 
    private OrderItems _items; 
    public OrderItems items 
    { 
     get { return _items; } 
     set 
     { 
      _items = value 
      _items.order = this 
     } 
    } 
} 

然后,你可以拿订单从初始化程序中删除:

Orders.Add(new Order() 
      { 
       id = 123, 
       date = new datetime(2012,03,26) 
       items = new OrderItems() 
         { 
         lineid = 1, 
         quantity = 3, 
         } 
      } 
+0

谢谢,这可能是解决方案的例子,但我问在对象初始化过程中是否有任何方法。 – Turbot 2012-03-26 19:41:50

+1

@laptop,我意识到这一点。正如JaredPar提到的那样,您希望按照您的示例做的事情是不可能的,所以这是最好的解决方法,无需像Jared建议的那样单独构建每个元素 – psubsee2003 2012-03-26 19:45:28