Передать метод как EventDelegate
Я пытаюсь передать метод в качестве параметра. Но я получаю ошибку компилятора, и я не совсем понимаю, что я делаю неправильно?
Ошибка компилятора:
Аргумент "#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 ответа
Сначала давайте разберемся с сообщением об ошибке. Должно быть ясно, что проблемная часть этой линии
.AddOnFinish( myOnFinish );
Так что же такое группа методов? Здесь уже отвечали раньше. Короче говоря, это то, что компилятор называет голой ссылкой на имя метода, который не включает () или какой-либо список аргументов. Вы не можете использовать группу методов самостоятельно. Он не имеет никакого представления в CLR. Это метод "группа", потому что, по крайней мере в теории, он представляет собой набор методов, с которыми компилятору придется выполнять разрешение перегрузки. Компилятор знает, как превратить группы методов (также лямбда-выражения и анонимные методы) в конкретные типы делегатов, но это все. myOnFinish
является группой методов, но здесь она действительно содержит только один метод.
Беглый взгляд на документы NGUI говорит мне, что вопреки своему названию EventDelegate - это не тип делегата, а просто класс, предназначенный для переноса делегата.
Так что у нас это. Компилятор не знает, как преобразовать группу методов в этот класс EventDelegate, и он выдает ошибку.
Чтобы это исправить, нам нужно предоставить конверсию. Что получается, просто вызовет конструктор EventDelegate:
.AddOnFinish( new EventDelegate(myOnFinish) );
Это работает, так как конструктор берет экземпляр EventDelegate.Callback
который является типом делегата, который совместим с myOnFinish
,
Вместо передачи метода в качестве аргумента определите делегата, имеющего ту же сигнатуру, что и метод, и передайте его в качестве аргумента функции.