今日、いくつかの古いコードを調べていたところ、次のようなイベントハンドラーが見つかりました。
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を使用しました。
このタイプのクラスを構築するためのより良い方法はありますか?このために設計された、私が知らないパターンはありますか?