今天我在查看一些旧代码时发现一个事件处理程序,看起来像这样:
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
的速度非常慢。将其装箱为object
的速度更快。 - bash0rdynamic
和object
之间有那种速度差异。谢谢。 - Chris