【发布时间】:2013-04-25 22:29:36
【问题描述】:
我有一个应用程序,我在其中对一系列元素执行操作,并且操作的确切性质取决于正在操作的元素的类型。由于封装的原因,不适合由元素来实现操作;这意味着它不能是元素类型的虚拟方法,因此“标准”多态性不起作用。我提出了一个与此相关的previous question,并被告知这被称为访问者模式。
我以前总是使用基于对象类型的if/elseif 调度程序方法来实现这一点,然后调用适当的实现。然而,最近,我注意到使用 dynamic 关键字可以完成同样的事情,如下所示:
private void ReconcileTips()
{
foreach (var step in _definition.Steps)
{
ReconcileTips((dynamic)step);
}
}
private void ReconcileTips(IBulkDispenseDefinition bulkDispense)
{
bulkDispense.TipType = ReconcileTip(bulkDispense.TipType);
}
private void ReconcileTips(ImportScreenDefinition importScreen)
{
foreach (var usage in importScreen.ReagentUsages)
usage.TipType = ReconcileTip(usage.TipType);
}
private void ReconcileTips(BuildScreenDefinition buildScreen)
{
foreach (var function in buildScreen.Functions)
function.TipType = ReconcileTip(function.TipType);
}
类似的模式可以用于与类结构平行的其他操作,例如为_definition.Steps 的每个元素创建视图模型。想法是编译器基本上将其转换为我之前编写的相同if/elseif 逻辑,从而节省了我的精力。所以,有几个问题:
动态调度有没有我没有考虑过的问题?我相信这相当于执行一系列
if (x is TypeA) Do((TypeA)x) else...,但我可能错了。这实际上是否比冗长的
if/elseif方法更清晰、更易于理解?
【问题讨论】:
-
除非我弄错了,否则您的代码似乎没有任何问题。相反,您只是在查看其他程序员对特定代码段的感受。在那种情况下,也许Code Review Stack Exchange 更适合这个问题?
-
@Mark,那可能是一个更好的位置,我可以迁移它;我想检查的主要项目是(1)(是否有我没有考虑过的与使用动态相关的陷阱。)
标签: c# .net dynamic visitor-pattern