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

Custom event args on a dynamically assigned event handler

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

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。

简单明了,你做不到。

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

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

请注意, 是 UI 事件处理程序的一个巧妙技巧。因为发送对象保存在 "sender" 中,你可以将 任何东西 放在 "Tag" 属性 中,你可以通过执行以下操作在事件中包含自定义数据:

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

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