通过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