Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态分配的事件处理程序上的自定义事件参数_C#_Reflection_Delegates - Fatal编程技术网

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

C# 动态分配的事件处理程序上的自定义事件参数,c#,reflection,delegates,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(bu

我正在分配一个单击事件处理程序,如下所示

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。

简单明了,您不能

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

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

请注意,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
执行此操作,因为它也是一个通用对象。当然,这不是事件处理程序,但它仍然是相同的总体思路。

简单明了,你不能

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

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

请注意,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
执行此操作,因为它也是一个通用对象。当然,这不是事件处理程序,但它仍然是相同的一般概念。

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