动态分配的事件处理程序上的自定义事件args

时间:2015-03-12 15:47:12

标签: c# reflection delegates

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

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。

1 个答案:

答案 0 :(得分:4)

简单明了,你不能。

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

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

请注意, UI事件处理程序的一个聪明技巧。因为发送对象保存在" sender"你可以把任何放在"标签"通过执行以下操作,您可以在事件中拥有自定义数据:

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

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