传递方法作为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");
    }
}

传递方法作为EventDelegate

首先让我们理解错误消息。很明显,这行有问题的部分是

.AddOnFinish( myOnFinish );

什么是方法组?这个问题已经在这里得到了解答。简而言之,它是编译器调用的对不包含()或任何参数列表的方法名的裸引用。您不能单独使用方法组。它在CLR中没有任何代表。它是一个方法"组",因为至少在理论上,它代表了编译器必须对其进行重载解析的一组方法。编译器知道如何将方法组(也包括lambdas和匿名方法)转换为特定的委托类型,但仅此而已。myOnFinish是一个方法组,但这里它实际上只包含一个方法。

快速浏览一下NGUI文档告诉我,与它的名字相反,EventDelegate不是一个委托类型,而只是一个用来包装委托的类。

就是这样。编译器不知道如何将方法组转换为EventDelegate类,因此会产生一个错误。

要修复它,我们需要提供转换。它会调用EventDelegate的构造函数:

.AddOnFinish( new EventDelegate(myOnFinish) );

这可以工作,因为构造函数接受EventDelegate.Callback的实例,该实例是与myOnFinish兼容的委托类型。

定义与方法具有相同签名的委托并将其作为参数传递给函数,而不是将方法作为参数传递。