Оболочка для функций одиночного вызова в делегатах C#C#

Место общения программистов C#
Ответить
Anonymous
 Оболочка для функций одиночного вызова в делегатах C#

Сообщение Anonymous »

Я хочу создать служебную функцию, позволяющую автоматически подписываться и отписываться от делегатов. Я хотел бы иметь возможность передавать функцию и делегат служебной функции, чтобы она автоматически подписывала данную функцию на делегата, а позже, когда делегат вызывается, автоматически отписывалась от функции. Это было бы полезно в моем коде по многим причинам, поскольку у меня есть много делегатов, которые вызываются часто, а также много функций, которые нужно вызывать только при первом срабатывании делегата. Кроме того, некоторые из этих функций используются многими делегатами, и я не могу отказаться от подписки на каждую из них при вызове функции. Я действительно не знаю, возможно ли это вообще, потому что я не опытный программист, но если что-то подобное или что-то подобное, или что-то, что может выполнять подписку по одному вызову, было бы полезно.
Я это пробовал
ЭТОТ КОД НЕ РАБОТАЕТ (но он может прояснить ситуацию)

Код: Выделить всё

// 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»