如何将EventHandler <t>转换为EventHandler <eventargs>?</eventargs> </t>

时间:2015-04-15 18:00:59

标签: c# casting event-handling

我正在创建一个集中式事件聚合器,它保留一个接受EventHandler委托的注册表。聚合器类本身不是通用的,但是寄存器方法是:

public void RegisterHandler<T>(EventHandler<T> handler) where T : EventArgs
{
    Debug.Assert(handler != null);
    if (handler != null)
    {
        if (this._eventRegistry != null)
        {
            this._eventRegistry.AddValue(typeof(T), handler);
        }
        else { /* Do nothing. */ }
    }
    else 
    { 
        throw new ArgumentNullException(ReflectionUtilities.GetVariableName(() => handler)); 
    }
}

目的是允许注册从EventArgs派生的任何类型。但是注册表(一种类型的Dictionary)接受EventArgs类型的EventHandler而不是类型为T的EventHandler,其中T是EventArgs。

该行

this._eventRegistry.AddValue(typeof(T), handler);

不会编译,因为它说它有一些无效的参数(特别是&#39; handler&#39;)。如果我将该参数更改为

this._eventRegistry.AddValue(typeof(T), handler as EventHandler<EventArgs>);

然后代码编译但参数&#39; handler&#39;具有空值。

同样,如果我这样做:

EventHandler<EventArgs> eventHandler = handler as EventHandler<EventArgs>;

然后&#39; eventHandler&#39;是空的。

如果我知道T被约束为EventArgs的类型或子类型,我该如何投射

EventHandler<T>

EventHandler<EventArgs>

1 个答案:

答案 0 :(得分:0)

您无法将EventHandler<T>投射到EventHandler<EventArgs>。一个有点丑陋但简单的解决方法是更改​​代码的这一行:

this._eventRegistry.AddValue(typeof(T), handler);

this._eventRegistry.AddValue(typeof(T), (sender, evt) => handler(sender, (T)evt));