我有一個應用程序正在對一系列元素執行操作,操作的確切性質取決於正在操作的元素的類型。出於封裝的原因,元素不適合執行操作;這意味着它不能是元素類型的虛擬方法,因此「標準」多態不起作用。我提出了與此相關的previous question,並被告知這被稱爲訪問者模式。在C#中使用'dynamic'來實現訪問者模式
我以前總是使用基於對象類型的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 (x is TypeA) Do((TypeA)x) else...
,但我可能是錯的。這是否比長長的
if/elseif
方法更清晰易懂?
除非我錯了,否則您的代碼似乎沒有任何問題。相反,您只是在檢查其他程序員對特定代碼段的感受。在這種情況下,[Code Review Stack Exchange](http://codereview.stackexchange.com)可能更適合這個問題? – 2013-05-01 21:09:24
@Mark,這可能是一個更好的位置,我會與它正在遷移好;我想檢查的主要項目是(1)(是否存在與我沒有考慮過的動態使用相關的陷阱) – 2013-05-01 21:14:34