В настоящее время у меня есть две такие функции
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();
}
Я попытался дедуплицировать код и увидел этот ответ
И столкнулся с проблемой, что я не знаю, как передать переменную из обоих мест в 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()
в качестве параметра
Спасибо @MakePeaceGreatAgain. Я не уверен, что понимаю, где мне это сделать, поскольку внутри GenerateDocument() нет знаний о docA. И внутри GenerateDocumentA() нет сведений о текущем цикле. Я готов переключиться на Func или что-то еще для поддержки компилятора
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, я отредактировал это, извините, мой плохой
Это выглядит очень красиво! Спасибо, буду тестить. Кроме того, могу ли я узнать название такого шаблона? это делегат/обратный вызов?
это делегат, а Action
— это быстро используемый делегат типа Generic
. и если вам нужно что-то вернуть, вы можете использовать Func
Вы можете использовать
SpecificCode.Invoke(docA, page, i)
. Однако вы потеряете поддержку компилятора, так какAction
полностью неограничен.