2012-03-26 2 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

+1

Кажется странным с точки зрения моделирования. Почему 'OrderItem' содержит' Order'? Я думаю, что 'Заказ' является совокупным корнем и содержит элементы с дополнительным контекстом об этих элементах (' OrderItem's). Но этим элементам действительно не нужно ничего знать о заказе. – David

+0

В качестве обходного решения вы можете сделать сеттер для 'items' прозрачным образом присвоить свойство, хотя это не будет работать для' OrderItem ', добавленных в коллекцию позже. – millimoose

ответ

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 это свойство, вы можете поставить что-то вроде этого в свойстве сеттер

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

+1

@ ноутбук, я это понимаю. Как упоминал JaredPar, то, что вы надеялись сделать на ваш пример, было невозможно, поэтому это было наилучшим способом обхода без создания каждого элемента отдельно, как предложил Джаред – psubsee2003

Смежные вопросы