我通過一些舊代碼,今天看,發現一個事件處理程序是這樣的:我認爲這是一種醜陋創建的事件處理程序處理多個事件類型
public void HandleEvent(EventClassA eventObj)
{
if(eventObj is EventSubClassA)
{
HandleEventSubClassA(eventObj as EventSubClassA);
}
else if(eventObj is EventSubClassB)
{
HandleEventSubClassB(eventObj as EventSubClassB);
}
else if(eventObj.GetType() == typeof(EventSubClassC))
{
HandleEventSubClassC(eventObj as EventSubClassC);
}
else if(eventObj is EventSubClassD)
{
HandleEventSubClassD(eventObj as EventSubClassD);
}
}
。所以我重構這樣的:
delegate void EventHandler(dynamic eventObj);
private static readonly Dictionary<Type, EventHandler> EVENT_MAP = new Dictionary<Type, EventHandler>()
{
{ typeof(EventSubClassA), HandleEventSubClassA },
{ typeof(EventSubClassB), HandleEventSubClassB },
{ typeof(EventSubClassC), HandleEventSubClassC },
{ typeof(EventSubClassD), HandleEventSubClassD }
};
public void HandleEvent(EventClassA eventObj)
{
EVENT_MAP[eventObj.GetType()](eventObj);
}
private void HandleEventSubClassA(dynamic evt)
{
var eventObj = evt as EventSubClassA;
}
我有一個同事檢查代碼,並有關於這個解決方案工作較以前的解決方案的方式的擔憂。我很難相信以前的解決方案是最好的解決方案,所以我轉向了StackOverflow。
有沒有更好的方法來建立這種類型的? 有沒有一種模式我不知道是專門爲此設計的?
數據輸入'dynamic'非常慢。 「對象」的拳擊方式更快。 – bash0r
似乎很容易通過調用每個子類型並查看發生了什麼來進行單元測試。 –
我沒有意識到'dynamic'和'object'之間存在那種速度差異。謝謝。 – Chris