Я пытаюсь использовать класс для упрощения динамической привязки и отмены привязки обратного вызова метода к делегату. Когда свойство Bound изменяется на другое значение, обратный вызов добавляется или удаляется из делегата actionEvent в зависимости от того, является ли привязка истинным или ложным.
public class Binding
{
private bool bound;
private Action actionEvent;
private Action callback;
//Constructor
public Binding(ref Action actionEvent, Action callback, bool isBound = true)
{
this.actionEvent = actionEvent; //actionEvent is either being cloned here, or whenever it's referenced
this.callback = callback;
this.bound = isBound;
if (this.bound)
{
Debug.Log("Binding callback to event!");
this.actionEvent += this.callback; //This is a reference to the plrInput class
}
}
//Bound property binds and unbinds the callback function to the event when changed
public bool Bound
{
get { return bound; }
set
{
if (bound != value)
{
bound = value;
if (bound)
{
Debug.Log("Rebinding callback!");
actionEvent += callback;
return;
}
actionEvent -= callback;
Debug.Log("Unbinding callback!");
}
}
}
}
Класс создается в стартовом методе следующим образом:
void Start
{
Binding JumpBinding = new Binding(ref plrInput.OnSpacePressed, Jump);
// plrInput.OnSpacePressed is a delegate from another class which is invoked when I press space
// Jump is a method which causes the player to jump
}
Я новичок в c#, и вчера я узнал о делегатах и ключевом слове ref, так что, возможно, моя проблема связана с недоразумением. Проблема, с которой я сталкиваюсь, заключается в том, что член класса actionEvent в Binding - это просто клон аргумента actionEvent, переданного через конструктор, даже если я передаю его по ссылке. Мне удалось подтвердить это путем тестирования.
Когда я вызываю plrInput.OnSpacePressed, когда обратный вызов привязан к элементу класса Binding actionEvent, обратный вызов не вызывается. Есть ли у кого-нибудь объяснение того, почему у меня такое поведение, и как я могу потенциально решить эту проблему или есть ли лучший подход?