通過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
如果我可以以某種方式聲明一個類型參數的數組(或某物),我可以這樣寫:
foreach (var T in typeParameterList)
{
if (worksheet.InsertElementAfter<T>(mergeCells))
break;
}
但我不知道有什麼辦法做到這一點。
那麼我有什麼選擇?
非常感謝。你給了我很大的推動力,因爲我從來沒有想過要這樣做。您的答案確實有機會避免使用反思並縮短代碼而不會有任何冗餘! – horgh 2013-02-19 23:38:33
我讓自己編輯你的答案,以顯示我使用你的代碼的方式。希望你同意這些修改。再次感謝你。 – horgh 2013-02-19 23:41:42
@KonstantinVasilcov:很好。現在它更短了。 – 2013-02-20 06:25:01