I looked over the old code today and found an event handler that looked like this:
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); } }
I thought it was disgusting. So I reorganized it like this:
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; }
I had a colleague looking at the code, and I had concerns about how this solution works compared to the previous solution. I hardly believe that the previous solution is the best solution for this case, so I switched to StackOverflow.
Is there a better way to build this type of class? Is there a pattern that I don't know about that is designed for this?
Chris source share