如何将 EventHandler<T> 转换为 EventHandler<EventArgs>?
How to cast EventHandler<T> to EventHandler<EventArgs>?
我正在创建一个集中式事件聚合器,它保留一个接受 EventHandler 委托的注册表。聚合器class本身不是通用的,但是注册方法是:
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 派生的任何类型的注册表。但是注册表(一种字典)接受 EventArgs 类型的 EventHandler 而不是 T 类型的 EventHandler,其中 T 是 EventArgs。
行
this._eventRegistry.AddValue(typeof(T), handler);
不会编译,因为它说它有一些无效参数(特别是 'handler')。如果我将该参数更改为
this._eventRegistry.AddValue(typeof(T), handler as EventHandler<EventArgs>);
然后代码编译但参数 'handler' 具有空值。
同样,如果我这样做:
EventHandler<EventArgs> eventHandler = handler as EventHandler<EventArgs>;
那么'eventHandler'为空。
如果我知道 T 被限制为 EventArgs 的类型或子类型,我该如何转换
EventHandler<T>
到
EventHandler<EventArgs>
?
您不能将 EventHandler<T>
转换为 EventHandler<EventArgs>
。一个有点难看但简单的解决方法是更改代码的这一行:
this._eventRegistry.AddValue(typeof(T), handler);
到
this._eventRegistry.AddValue(typeof(T), (sender, evt) => handler(sender, (T)evt));
我正在创建一个集中式事件聚合器,它保留一个接受 EventHandler 委托的注册表。聚合器class本身不是通用的,但是注册方法是:
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 派生的任何类型的注册表。但是注册表(一种字典)接受 EventArgs 类型的 EventHandler 而不是 T 类型的 EventHandler,其中 T 是 EventArgs。
行
this._eventRegistry.AddValue(typeof(T), handler);
不会编译,因为它说它有一些无效参数(特别是 'handler')。如果我将该参数更改为
this._eventRegistry.AddValue(typeof(T), handler as EventHandler<EventArgs>);
然后代码编译但参数 'handler' 具有空值。
同样,如果我这样做:
EventHandler<EventArgs> eventHandler = handler as EventHandler<EventArgs>;
那么'eventHandler'为空。
如果我知道 T 被限制为 EventArgs 的类型或子类型,我该如何转换
EventHandler<T>
到
EventHandler<EventArgs>
?
您不能将 EventHandler<T>
转换为 EventHandler<EventArgs>
。一个有点难看但简单的解决方法是更改代码的这一行:
this._eventRegistry.AddValue(typeof(T), handler);
到
this._eventRegistry.AddValue(typeof(T), (sender, evt) => handler(sender, (T)evt));