Я хочу создать служебную функцию, позволяющую автоматически подписываться и отписываться от делегатов. Я хотел бы иметь возможность передавать функцию и делегат служебной функции, чтобы она автоматически подписывала данную функцию на делегата, а позже, когда делегат вызывается, автоматически отписывалась от функции. Это было бы полезно в моем коде по многим причинам, поскольку у меня есть много делегатов, которые вызываются часто, а также много функций, которые нужно вызывать только при первом срабатывании делегата. Кроме того, некоторые из этих функций используются многими делегатами, и я не могу отказаться от подписки на каждую из них при вызове функции. Я действительно не знаю, возможно ли это вообще, потому что я не опытный программист, но если что-то подобное или что-то подобное, или что-то, что может выполнять подписку по одному вызову, было бы полезно.
Я это пробовал
ЭТОТ КОД НЕ РАБОТАЕТ (но он может прояснить ситуацию)
Код: Выделить всё
// Two delegates used oftenly
public Action OnRoundStart;
public Action OnRoundEnd;
//In main block, want to call MyFonction only once in the delegates :
UtilitySingleCall(ref OnRoundStart, MyFunction);
UtilitySingleCall(ref OnRoundEnd, MyFunction);
OnRoundStart?.Invoke(); // Should call the function twice
OnRoundEnd?.Invoke(); //
//Next round
OnRoundStart?.Invoke(); // Should do nothing
OnRoundEnd?.Invoke();
public void MyFunction(){
Console.WriteLine("MyFunction");
}
public void UtilitySingleCall(ref Action eventDel, Action func){
void Wrapper(){
func();
eventDel -= Wrapper; //This doesn't work, can't use ref param in
} //Local fonction declaration
eventDel += Wrapper;
}
Если у кого-нибудь есть идея, как я мог бы сделать что-то подобное, или если это невозможно, то обходной путь, позволяющий не добавлять флаги и проверки в функцию для отмены подписки, был бы очень полезен. (Также, пожалуйста, извините за мой английский, а не мой родной язык)
Подробнее здесь:
https://stackoverflow.com/questions/793 ... es-c-sharp