【问题标题】:Why I cannot handle a EventHandler<XXX> with an EventHandler?为什么我不能用 EventHandler 处理 EventHandler<XXX>?
【发布时间】:2013-07-13 04:36:14
【问题描述】:

我有以下代码试图在运行时附加通用事件处理程序:

EventInfo info = source.GetType().GetEvent("EventWithArgsInheritingFromEventArg");
info.AddEventHandler(source, new EventHandler((obj, args) => DoSomething()));

当我尝试这样做时,我得到以下异常:

“System.EventHandler”类型的对象无法转换为类型 'System.Windows.Controls.DataGridSortingEventHandler'。

据我了解,带有签名的方法(对象发送者,EventArgs e)可以处理任何带有从 EventArgs 继承的参数的事件,对吧?

我的方法有什么问题?

谢谢

编辑:这有什么不同吗?会不会是DaraGridSortingEventHandler不继承EventHandler???

【问题讨论】:

  • 也许是协变/逆变废话?听起来好像在某个地方从 EventHandler 到 DataGridSortingEventHandler..
  • @LewsTherin:可能是。当我不得不处理这些术语时,我总是很头疼......
  • 我也是 :( 要尝试解决它,也许您应该发送派生类型的 DataGrid 事件处理程序。
  • 根据MSDNDataGridSortingEventArgs 肯定派生自EventArgs
  • 您使用的是 .NET 4 吗?委托对象差异仅在 .NET 4 中引入...

标签: c# .net events delegates


【解决方案1】:

您不能使用AddEventHandler 方法使用不同的委托,但一种解决方法是首先使用Delegate.CreateDelegate 创建一个委托:

EventInfo info = source.GetType().GetEvent("EventWithArgsInheritingFromEventArg");

// create the event handler
var eventhandler = new EventHandler(this.DoSomething);

// create a delegate from the EventHandler
var @delegate = Delegate.CreateDelegate(info.EventHandlerType, null, eventhandler.Method);

info.AddEventHandler(source, @delegate);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多