Работая над OpenXml, я столкнулся с этой статьей: How to: Merge two adjacent cells in a spreadsheet document (Open XML SDK).Есть ли способ передать массив параметров типа в общий метод?
Существует образец кода, который я хотел бы реорганизовать. Вот его часть:
// Insert a MergeCells object into the specified position.
if (worksheet.Elements<CustomSheetView>().Count() > 0)
{
worksheet.InsertAfter(mergeCells,
worksheet.Elements<CustomSheetView>().First());
}
else if (worksheet.Elements<DataConsolidate>().Count() > 0)
{
worksheet.InsertAfter(mergeCells,
worksheet.Elements<DataConsolidate>().First());
}
else if (worksheet.Elements<SortState>().Count() > 0)
{
worksheet.InsertAfter(mergeCells,
worksheet.Elements<SortState>().First());
}
//...and 5 more
Самое лучшее, что мне удалось это метод расширения:
public static bool InsertElementAfter<T>(this Worksheet worksheet,
OpenXmlElement element)
where T : OpenXmlElement
{
if (!worksheet.Elements<T>().Any())
return false;
else
{
worksheet.InsertAfter(element, worksheet.Elements<T>().First());
return true;
}
}
Но его использование выглядит так же ужасно, как исходный код:
if (!worksheet.InsertElementAfter<CustomSheetView>(mergeCells))
if (!worksheet.InsertElementAfter<DataConsolidate>(mergeCells))
if (!worksheet.InsertElementAfter<SortState>(mergeCells))
//...and 5 more
If I мог бы каким-то образом объявить массив (или что-то) параметров типа, я мог бы написать что-то вроде этого:
foreach (var T in typeParameterList)
{
if (worksheet.InsertElementAfter<T>(mergeCells))
break;
}
Но я не знаю, как это сделать.
Итак, каковы мои варианты?
Большое вам спасибо. Ты дал мне большой толчок, так как я никогда не думал о таком трюке. Ваш ответ дает возможность избежать отражения и сократить код без избыточности! – horgh
Позвольте себе отредактировать ваш ответ, чтобы показать, как я использовал ваш код. Надеюсь, вы согласитесь с этими изменениями. Еще раз спасибо. – horgh
@ Константин Васильков: Ницца. Теперь он еще короче. –