Ссылка на анонимного родителя от анонимного потомка при объявлении вложенных объектов с помощью Object Initializer - PullRequest
0 голосов
/ 09 ноября 2019

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

Например, рассмотрим заголовок счета-фактуры, строку счета-фактуры, разбивку строки счета-фактуры:

public class InvoiceHeaderModel
{
    public List<InvoiceLineModel> InvoiceLineModels { get; set; }
}

public class InvoiceLineModel
{
    public List<InvoiceLineBreakdown> InvoiceLineBreakdowns { get; set; }
}

public class InvoiceLineBreakdown
{
    public InvoiceLineBreakdown(InvoiceLineModel parentInvoiceLine)
    {
        _parentInvoiceLine = parentInvoiceLine;
    }

    private InvoiceLineModel _parentInvoiceLine;
}

Я хотел бы иметь возможность сделать следующее:

public InvoiceHeaderModel BuildAnInvoice()
{
    return new InvoiceHeaderModel
    {
        InvoiceLineModels = new List<InvoiceLineModel>
        {
            new InvoiceLineModel
            {
                InvoiceLineBreakdowns = new List<InvoiceLineBreakdown>
                {
                    new InvoiceLineBreakdown(/* Need to reference the anonymous outer InvoiceLineModel*/),
                    new InvoiceLineBreakdown()
                }
            }
        }
    };
}

Но я не могу, так как конструктору InvoiceLineBreakdown нужна ссылка на анонимный InvoiceLineModel, который его содержит.

Я ценю, что есть хорошие аргументы для того, чтобы не ссылаться на родителей из детей, но есть лиспособ достижения вложенного объявления выше с использованием Object Initializer], или мне просто нужно явно объявить все объекты и затем составить заголовок Invoice впоследствии?

1 Ответ

0 голосов
/ 09 ноября 2019

Используйте ссылку на переменную.

Вот полный пример:

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var ihm = new 
    {
        InvoiceLineModels = new List<Object>
        {
           new {
               Test = 1,
               //ihm = ihm Can't be used here until the declaration is completed nor can this be used.
           }
        }
    };
        //ihm is available here 
        Console.WriteLine(ihm.ToString());
    }
}

Кажется, вам следует разделить процессы;загрузите потомков из БД и затем добавьте их в список, который нужно вернуть, который можно сохранить в ihm. Используйте синтаксис let для достижения того же самого во время запроса.

В итоге. Whes POF для распределения и т. Д. Удачи

...