如何将方法名称作为参数发送
本文关键字:参数 方法 | 更新日期: 2023-09-27 18:29:01
我想在c#中为一夫一妻制创建一些引擎。我的引擎必须包括按钮。我想通过事件来做到这一点。基本上我已经完成了,但我想改进它,于是我的问题就开始了。
class Button : Component
{
....
public event EventHandler<EventArgs> Click;
public void OnClick()
{
if (MousePressed() && Click != null)
{
Click(this, new EventArgs());
}
}
}
当我想添加点击事件时,我必须在另一个类中完成:
_buttnon.Click += new EventHandler<EventArgs>(Method);
_buttnon.OnClick();
它工作得很好,但我想用以下方式来做:
_button.RegisterClickEvent(Method);
所以我在下面的按钮类代码中添加了:
public void RegisterClickEvent(XXX method) {
Click += new EventHandler<EventArgs>(method);
}
我完全不知道我必须用什么来代替XXX。我试过了:
public void RegisterClickEvent(void(object, EventArgs)method) {
Click += new EventHandler<EventArgs>(method);
}
但它不起作用。我试着在谷歌上搜索一些东西,但我不知道我在找什么。
您想要的是操作,类似于以下内容:
public void RegisterClickEvent(Action<object, EventArgs> method)
{
Click += new EventHandler<EventArgs>(method);
}
简单使用委托:
public void RegisterClickEvent(EventHandler<EventArgs> method)
{
Click += new EventHandler<EventArgs>(method);
}
或
public void RegisterClickEvent(EventHandler method)
{
Click += new EventHandler<EventArgs>(method);
}
这是有效的(至少在VS2015中,也许在以前有另一种方式(在2010年之前,因为代理有一些变化)。
Method
是一个方法组。方法组没有类型,但是可以隐式转换为兼容的委托类型。如果将委托指定为方法参数,则可以使用方法组作为参数来调用该方法,该方法将被隐式转换。
将所有这些翻译成你的代码,这将是
public void RegisterClickEvent(EventHandler<EventArgs> handler)
{
Click += handler;
}
如果Method
的签名与EventHandler<EventArgs>
的委托兼容,则可以将其用作
_button.RegisterClickEvent(Method);
相当于
_button.RegisterClickEvent(new EventHandler<EventArgs>(Method));
它并没有真正为内置的事件+=
操作符添加任何额外的功能。
由于EventHandler<EventArgs>
的构造函数将EventHandler<EventArgs>
作为参数,因此可以使用以下代码:
public void RegisterClickEvent(EventHandler<EventArgs> method)
{
Click += new EventHandler<EventArgs>(method);
}
...
RegisterClickEvent(Method);