通往罗马的路很多,解决问题的方法也不少。一种简单的方法是为具体的事件处理程序类型使用泛型抽象基类,它可以提供
Handle(TEvent evt)
方法。
public abstract class HandlerBase<T> where T : TEvent, new()
{
public abstract void Handle(T evt);
public void Handle(TEvent evt)
{
if (!(evt is T))
{
throw new ArgumentException("This handler does not support the event type " + evt.GetType().FullName);
}
Handle((T) evt);
}
}
您的特定事件处理程序将从这个抽象基类派生,类似于下面的代码示例:
public class SpecificEventHandler: HandlerBase<SpecificEvent>
{
public override void Handle(SpecificEvent evnt)
{
....
}
}
然后可以将问题中的代码简化为:
foreach (var evt in eventItems)
{
...
dynamic eventHandler = ResolveEventHandler(evt.GetType().Name);
eventHandler.Handle(evt);
}
另外,不允许使用
TEvent
本身作为泛型类型参数,将tevent声明为抽象类或将其转换为接口(注意
new()
我使用的约束
手柄座
上面,它只允许将conrete、instantiable类型用作泛型类型参数)。使用
特文特
本身作为上面显示的handlerbase类i的泛型类型参数将导致两个
把手
具有相同签名的方法,导致编译错误。