将方法作为EventDelegate传递

时间:2014-08-10 04:40:11

标签: c# delegates unity3d ngui

我正在尝试将方法作为参数传递。但我收到编译错误,我不明白我做错了什么?

编译错误是:

  

参数“#1”无法将“方法组”表达式转换为“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");
    }
}

2 个答案:

答案 0 :(得分:1)

首先让我们理解错误信息。应该清楚的是,该行的问题部分是

.AddOnFinish( myOnFinish );

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

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

所以我们拥有它。编译器不知道如何将方法组转换为此EventDelegate类,并且它会产生错误。

要修复它,我们需要提供转换。结果证明,它只是调用EventDelegate的构造函数:

.AddOnFinish( new EventDelegate(myOnFinish) );

这是有效的,因为构造函数采用EventDelegate.Callback的实例,它是与myOnFinish兼容的委托类型。

答案 1 :(得分:0)

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