传递方法作为EventDelegate
本文关键字:EventDelegate 方法 | 更新日期: 2023-09-27 18:17:13
我试图传递一个方法作为参数。但我得到一个编译器错误,我不太明白我做错了什么?
编译错误是:
参数' #1'无法将'method group'表达式转换为'EventDelegate'类型
public class AssignEventDelegate : MonoBehaviour {
public UISprite sprite;
public void AddOnFinish (EventDelegate method) {
EventDelegate.Add (sprite.GetComponent<TweenScale>().onFinished, method);
}
}
public class AssignEventDelegateOther : MonoBehaviour {
// Use this for initialization
void Start () {
// Compiler error occurs below
GameObject.Find ("Main Camera").gameObject.GetComponent<AssignEventDelegate>().AddOnFinish( myOnFinish );
}
public void myOnFinish () {
Debugger.print ("myOnFinish");
}
}
首先让我们理解错误消息。很明显,这行有问题的部分是
.AddOnFinish( myOnFinish );
什么是方法组?这个问题已经在这里得到了解答。简而言之,它是编译器调用的对不包含()或任何参数列表的方法名的裸引用。您不能单独使用方法组。它在CLR中没有任何代表。它是一个方法"组",因为至少在理论上,它代表了编译器必须对其进行重载解析的一组方法。编译器知道如何将方法组(也包括lambdas和匿名方法)转换为特定的委托类型,但仅此而已。myOnFinish
是一个方法组,但这里它实际上只包含一个方法。
快速浏览一下NGUI文档告诉我,与它的名字相反,EventDelegate不是一个委托类型,而只是一个用来包装委托的类。
就是这样。编译器不知道如何将方法组转换为EventDelegate类,因此会产生一个错误。
要修复它,我们需要提供转换。它会调用EventDelegate的构造函数:
.AddOnFinish( new EventDelegate(myOnFinish) );
这可以工作,因为构造函数接受EventDelegate.Callback
的实例,该实例是与myOnFinish
兼容的委托类型。
定义与方法具有相同签名的委托并将其作为参数传递给函数,而不是将方法作为参数传递。