如何将方法名称作为参数发送

本文关键字:参数 方法 | 更新日期: 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);