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

时间:2016-01-05 18:07:26

标签: c# events

我想在c#中为monogame创建一些引擎。我的引擎必须包含按钮。我想用事件来做。基本上我已经完成了,但我想改进它,并开始我的问题。

  class Button : Component
  {
    ....
    public event EventHandler<EventArgs> Click;
    public void OnClick()
    {
        if (MousePressed() && Click != null)
        {
            Click(this, new EventArgs());
        }
    }
  }

当我想添加Click事件时,我必须在另一个类中执行:

_buttnon.Click += new EventHandler<EventArgs>(Method);
_buttnon.OnClick();

它很好用,但我想按照以下方式进行:

_button.RegisterClickEvent(Method);

所以我添加到下面的Button类代码中:

 public void RegisterClickEvent(XXX method) {
        Click += new EventHandler<EventArgs>(method);
 }

我完全不知道我有什么需要更换XXX。我试过了:

 public void RegisterClickEvent(void(object, EventArgs)method) {
        Click += new EventHandler<EventArgs>(method);
 }

但它不起作用。我试图在Google上搜索某些内容,但我不知道我在寻找什么。

4 个答案:

答案 0 :(得分:2)

你想要的是action,如下所示:

String[] strs = new String[nums.length];
for(int i=0; i<nums.length; i++){
    strs[i] = String.valueOf(nums[i]);
}

Arrays.sort(strs, new Comparator<String>(){
    public int compare(String s1, String s2){
        String leftRight = s1+s2;
        String rightLeft = s2+s1;
        return -leftRight.compareTo(rightLeft);

    }
});

StringBuilder sb = new StringBuilder();
for(String s: strs){
    sb.append(s);
}

return sb.toString();

答案 1 :(得分:1)

由于EventHandler<EventArgs>获取EventHandler<EventArgs>的构造函数作为参数,您可以使用以下代码:

public void RegisterClickEvent(EventHandler<EventArgs> method)
{
    Click += new EventHandler<EventArgs>(method);
}

...
RegisterClickEvent(Method);

答案 2 :(得分:1)

简单使用委托:

  public void RegisterClickEvent(EventHandler<EventArgs> method)
  {
    Click += new EventHandler<EventArgs>(method);
  }

  public void RegisterClickEvent(EventHandler method)
  {
    Click += new EventHandler<EventArgs>(method);
  }

这是有效的(至少在VS2015中,或许在之前有另一种方式(2010年之前,因为代表们有一些变化)。

答案 3 :(得分:1)

Method是一个方法组。方法组没有类型,但可以隐式转换为兼容的委托类型。如果将委托指定为方法参数,则可以使用方法组作为参数调用该方法,并将隐式转换该方法。

将所有这些翻译成您的代码,它将是

public void RegisterClickEvent(EventHandler<EventArgs> handler) 
{
    Click += handler;
}

如果Method的签名与EventHandler<EventArgs>委托兼容,您可以将其用作

_button.RegisterClickEvent(Method);

这相当于

_button.RegisterClickEvent(new EventHandler<EventArgs>(Method));

它并没有为事件的内置+=运算符添加任何额外的功能。