【问题标题】:Custom event args on a dynamically assigned event handler动态分配的事件处理程序上的自定义事件参数
【发布时间】:2015-03-12 15:47:11
【问题描述】:

我正在分配一个像这样的点击事件处理程序

var buttonEvent = button.GetType().GetEvent("Click");
var eventMethod = GetType().GetMethod("button_Click");

var handler = Delegate.CreateDelegate(buttonEvent.EventHandlerType, this, eventMethod);

buttonEvent.AddEventHandler(button, handler);

点击事件处理程序是这样的:

void button_Click(object sender, EventArgs e) { }

如何将自定义参数传递给处理程序?理想情况下我会喜欢

void button_Click(object sender, MyCustomEventArgs e) { }

我可以在分配事件时设置 MyCustomEventArgs。

【问题讨论】:

  • 你学过继承吗?
  • 我知道MyCustomEventArgs 将扩展EventArgs。我只是不知道在哪里/如何在其中放置任何东西
  • 在扩展 ButtonMyCustomButton 中,覆盖 onClick 方法
  • 不太可行。必须有另一种方法,但这仍然不能解释我如何填充 MyCustomEventArgs

标签: c# reflection delegates


【解决方案1】:

简单明了,你不能。

Button 类调用该事件,当它调用它时,它会填充参数。在这种情况下,使用 EventArgs 对象(不允许自定义数据)。

这适用于 任何 事件。除非引发事件的类支持将自定义数据插入事件流的某种方式,否则您无法通过事件处理程序控制它为您提供的内容。

请注意,对于 UI 事件处理程序, 有一个巧妙的技巧。因为发送对象保存在“sender”中,并且您可以将 anything 放在“Tag”属性中,您可以通过以下方式在事件中包含自定义数据:

control.Tag = someObject;
control.Click += (o, e) =>
{
     Control c = o as Control;
     MyObject data = c.Tag as MyObject;
     //use data
};

此外,在 WPF 中,您可以使用 CommandParameter 执行此操作,因为它也是一个通用对象。当然,这不是事件处理程序,但它仍然是相同的一般概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多