Шаблон Builder с вложенными объектами

Привет, у меня проблема.

Я хочу реализовать шаблон построения, чтобы упростить создание объектов. Проблема, с которой я сталкиваюсь, связана с вложенным объектом. Объект, который я хотел бы создать, содержит в себе список других объектов, и я действительно не знаю, как его решить.

Я хочу иметь возможность сделать следующее (например, простые объекты):

Receipt RestaurantReceipt = new ReceiptBuilder() .withDate("value") .withName("value") .AddItem("value") .WithIngredients("value") .WithType("value") .AddItem("value") .WithIngredients("value") .WithType("value") .build(); 

Или что-то вроде:

 Receipt RestaurantReceipt = new ReceiptBuilder() .withDate("value") .withName("value") .AddItem("value", item => { .WithIngredients("value") .WithType("value") }) .AddItem("value", item => { .WithIngredients("value") .WithType("value") }) .build(); 

Пример должен быть репрезентативным для моей ситуации, хотя, если вы получили более одного типа вложенного объекта.

    Учитывая такой код

     var rb = new ReceiptBuilder(); var receipt = rb.WithName("Name") .WithDate(DateTime.Now) .WithItem("Item1", i => i.WithIngredients("Ingredients1")) .WithItem("Item2", i => i.WithIngredients("Ingredients1")) .Build(); Console.WriteLine(receipt); 

    Ваш строитель довольно прост, используя некоторые простые предикаты внутри AddItem Builder AddItem чтобы пользователь мог сконфигурировать каждый элемент в подобном шаблоне «строитель» на верхнем уровне ReceiptBuilder :

     public class ReceiptBuilder { private Receipt r; public ReceiptBuilder() { r = new Receipt(); } public ReceiptBuilder WithName(string name) { r.Name = name; return this; } public ReceiptBuilder WithDate(DateTime dt) { r.Date = dt; return this; } public ReceiptBuilder WithItem(string text, Action itemBuilder) { var rib = new ReceiptItemBuilder(text); itemBuilder(rib); r.AddItem(rib.Build()); return this; } public Receipt Build() { return r; } } public class ReceiptItemBuilder { private ReceiptItem ri; public ReceiptItemBuilder(string text) { ri = new ReceiptItem(text); } public ReceiptItemBuilder WithIngredients(string ings) { ri.Ingredients = ings; return this; } // WithType omitted for brevity. internal ReceiptItem Build() { return ri; } } 

    Рабочий пример: http://rextester.com/IRR50897