我有两个重载方法如下:
Render(PDFTable table)
Render(PDFText text)
我必须从for..each循环中的另一个方法调用这些方法,并传递如下参数:
foreach (var item in sectionPDF.sectionElements)
{
if (item.GetType().Equals(typeof(PDFTable)))
{
Render((PDFTable)item);
}
else if (item.GetType().Equals(typeof(PDFText)))
{
Render((PDFText)item);
}
}
我想知道,如果有任何方法可以删除if..else语句并动态解析类型?提前谢谢。
答案 0 :(得分:1)
不,没有。 C#不支持基于参数类型的虚拟调度。过载分辨率纯粹是编译时的问题。因此,您必须自己做出决定,无论是现在的方式,使用某种形式的决策表,使用提供决策的提供者类,还是其他适合您的软件设计。
答案 1 :(得分:1)
您可以使用dynamic
。
首先声明一个这样的方法:
void RenderDispatch(dynamic item)
{
Render(item);
}
Render((PDFTable)
Render((PDFText)
然后在foreach
:
foreach (var item in sectionPDF.sectionElements)
{
RenderDispatch(item);
}
运行时要注意调用正确的覆盖。
小心 dynamic
会导致性能问题。
答案 2 :(得分:0)
你可以制作你的"渲染"方法通用:
void Render<T> (T item)
{
//your stuff here
}
然后:
foreach (var item in sectionPDF.sectionElements)
{
Render(item);
}