C# Как избежать дублирования кода, когда разница находится в середине цикла

В настоящее время у меня есть две такие функции

GenerateDocumentA(DocumentA docA)
{
    OpenDocumentCode();
    for (int i = 0; i < pageCount; i ++)
    {
        // some common per page code, var page = xxx
        SpecificCodeA(docA, page, i);
    }
    CloseDocumentCode();
}

GenerateDocumentB(DocumentB docB)
{
    OpenDocumentCode();
    for (int i = 0; i < pageCount; i ++)
    {
        // some common per page code, var page = xxx
        SpecificCodeB(docB, page, i);
    }
    CloseDocumentCode();
}

Я попытался дедуплицировать код и увидел этот ответ

https://codereview.stackexchange.com/questions/18379/how-to-remove-code-duplication-that-difference-only-a-few-lines

И столкнулся с проблемой, что я не знаю, как передать переменную из обоих мест в SpecificCode()

GenerateDocument(Action SpecificCode)
{
    OpenDocumentCode();
    for (int i = 0; i < pageCount; i ++)
    {
        // some common per page code, var page = xxx
        SpecificCode(); // How to pass the current page / page index
    }
    CloseDocumentCode();
}

GenerateDocumentA(DocumentA docA)
{
    GenerateDocument( () => { } ) // how to also pass the DocumentA docA
}

Мой вопрос: как я могу определить и передать SpecificCode() в GenerateDocument() общий код, зная, что SpecificCode() принимает переменную как в GenerateDocumentA(), так и в GenerateDocument() в качестве параметра

Вы можете использовать SpecificCode.Invoke(docA, page, i). Однако вы потеряете поддержку компилятора, так как Action полностью неограничен.

MakePeaceGreatAgain 11.11.2022 10:27

Спасибо @MakePeaceGreatAgain. Я не уверен, что понимаю, где мне это сделать, поскольку внутри GenerateDocument() нет знаний о docA. И внутри GenerateDocumentA() нет сведений о текущем цикле. Я готов переключиться на Func или что-то еще для поддержки компилятора

qkhanhpro 11.11.2022 10:33
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
2
2
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
GenerateDocument(Action<int,int> todo)
{
    OpenDocumentCode();
    for (int i = 0; i < pageCount; i ++)
    {
        // some common per page code, var page = xxx
        todo(page,i);
    }
    CloseDocumentCode();
}

вариант использования:

DocumentA docA;
GenerateDocument((int page, int i)=>
{
    SpecificCodeA(docA, page, i);
});

DocumentB docB;
GenerateDocument((int page, int i)=>
{
    SpecificCodeB(docB, page, i);
});

@BartHofland, я отредактировал это, извините, мой плохой

TimChang 11.11.2022 10:36

Это выглядит очень красиво! Спасибо, буду тестить. Кроме того, могу ли я узнать название такого шаблона? это делегат/обратный вызов?

qkhanhpro 11.11.2022 10:41

это делегат, а Action — это быстро используемый делегат типа Generic. и если вам нужно что-то вернуть, вы можете использовать Func

TimChang 11.11.2022 10:48

Другие вопросы по теме