我想在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上搜索某些内容,但我不知道我在寻找什么。
答案 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));
它并没有为事件的内置+=
运算符添加任何额外的功能。