@farkhatovich

Как добавить дополнительную обработку при подписывании делегата на событие?

Как добавить дополнительную обработку и можно ли это сделать?
  • Вопрос задан
  • 529 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Sumor
Для этого у события нужно описать методы add и remove:
using System;

namespace AddRemoveTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var a = new A();
            a.MyEvent += (s,e) => {Console.WriteLine("Event");};
            
            
            a.MyEvent -= (s,e) => {Console.WriteLine("Event");};
        }
    }
    
    public class A
    {
        public event EventHandler MyEvent
        {
            add{
                
                Console.WriteLine("Add event");
            }
            remove{
                Console.WriteLine("Remove event");
            }
        }
    }
}
// Вывод:
// Add event
// Remove event
Ответ написан
Комментировать
На сколько я понял вопрос, на столько будет и ответ)

У вас по видимому имеется событие, на которые вы подписываете обработчики, но прежде чем подписать, хотите что-то сделать.

Если это так, то самое первое, что приходит на ум, это написать метод, который на вход будет принимать делегат, что-то (из ходя из контекста вопроса) делать, и в самом конце собствено, производить "подписку" этого делегата.
Ответ написан
Комментировать
DarkRaven
@DarkRaven
разработка программного обеспечения
Допустим, у вас есть класс API.
В нем, у вас есть вот такой event:
public event TokenRecivedEventHandler OnTokenRecived;

и метод:
public async Task GetTokenEvtAsync(Models.LoginViewModel loginModel)
{
    var response = await GetToken(loginModel);
    OnTokenRecived?.Invoke(this, new TokenRecivedEventArgs(response));
}


В другом месте(классе, форме и т.п) вы делаете:
var api = new API();
api.OnTokenRecived += Api_OnTokenRecived;
api.OnTokenRecived += Api_OnTokenRecived2;

await api.GetTokenEvtAsync(loginModel: viewModel);

api.OnTokenRecived -= Api_OnTokenRecived;
api.OnTokenRecived -= Api_OnTokenRecived2;


И два обработчика:

private void Api_OnTokenRecived(object sender, TokenRecivedEventArgs args)
{
    TokenDecoder.Decode(args.Token, tokenResult);
}

private void Api_OnTokenRecived2(object sender, TokenRecivedEventArgs args)
{
    buttonLogin.Enabled = false;
    buttonLogout.Enabled = !buttonLogin.Enabled;
    buttonApiGetUser.Enabled = !buttonLogin.Enabled;
    buttonApiGetUserFields.Enabled = !buttonLogin.Enabled;
}


И все. Примеры взяты из рабочего кода и адаптированы под условие вопроса. Все работает. Вы просто вешаете два обработчика на свое событие.

Другой вопрос, если вам нужно чтобы выполнялось с определенной очередностью, тут вам без Event Aggregator-а не обойтись, с нестандартной логикой.

P.S. Если вам не два обработчика нужно, а именно какое-то дополнительное действие, то тут немного по-другому.

private EventHandler _eventHandler;

public event EventHandler OnCustomEvent
{
    add 
    { 
        _eventHandler += value; 
        Log("Обработчик добавлен");
    }
    remove 
    { 
        _eventHandler -= value; 
        Log("Обработчик удален");
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы