C# 委托参数-基类/派生类冲突

C# 委托参数-基类/派生类冲突,c#,C#,说到C#,我有点不知所措,这就是为什么我来到你们这里希望得到一些澄清。我有一个EventDispatcher类,它定义了一个委托: delegate void EventHandler(BaseEvent evt); 以及一些使用它的方法: void AddEventListener(string event_name, EventHandler handler) void RemoveEventListener(string event_name, EventHandler handler

说到C#,我有点不知所措,这就是为什么我来到你们这里希望得到一些澄清。我有一个EventDispatcher类,它定义了一个委托:

delegate void EventHandler(BaseEvent evt);
以及一些使用它的方法:

void AddEventListener(string event_name, EventHandler handler)
void RemoveEventListener(string event_name, EventHandler handler = null)
void DispatchEvent(BaseEvent evt)
我还有派生的事件类,例如
DerivedEvent
,它继承自
BaseEvent
,并在顶部添加它们自己的属性/字段

正如所料,我会这样使用它:

AddEventListener("my_event", MyEventHandler);
我的Handler方法如下所示:

void MyEventHandler(BaseEvent evt)
最后是实际问题。为什么我不能定义一个使用派生事件类作为参数的处理程序,如下所示:

void MyEventHandler(DerivedEvent evt)
我甚至尝试过通过接口,但没有什么不同。我目前正在方法体中对实际事件类进行强制转换:

...
DerivedEvent actualEvent = (DerivedEvent)evt;
...

这真的是唯一的办法吗?希望有人能告诉我:)

当调用代理时,允许调用方传入任何
BaseEvent
。它不一定是
衍生事件
。由于调用方可能传入的对象不是
DerivedEvent
,因此处理程序不能假定传入的值是
DerivedEvent


您可以做的是添加一个处理程序,它不仅可以接受任何
BaseEvent
,还可以接受其他内容。例如,您可以添加一个接受
object
作为参数的处理程序,因为调用处理程序时传入的任何
BaseEvent
都将是
对象

我不太明白。如果我进一步深入兔子洞,我仍然会将其转换为事件来自的实际类no?@SandroDucceschi如果调用委托的代码实际上将提供一个
DerivedEvent
,那么该参数应该是委托中的参数。如果不是,那么您就无能为力,因为该参数实际上不是一个
DerivedEvent
。强制转换只是让它在运行时而不是编译时失败。好吧,我们的想法是建立一个系统,在这个系统中,我可以从
BaseEvent
传递任何派生类,然后调用相应的处理程序,该处理程序将所述派生类作为参数。如下所示:
AddEventListener(DerivedEvent.AN_事件,DerivedEventHandler);作废DerivedEventHandler(DerivedEvent evt)BaseEvent
更具体的对象类型;这是它对调用方的最大假设。明白了!:)很抱歉这么固执:)。有没有其他方法可以实现我的目标?或者这只是我不得不忍受的一个限制?