Класс служебной программы для обработки подписок на события (AddSubscription () / UnsubscribeAll ()) - PullRequest
3 голосов
/ 14 июля 2011

Я часто заканчиваю тем, что пишу функции SubscribeToEvents() и UnsubscribeEvents(), которые вызываются в моих установках свойств, когда свойство получает новое значение.Хотя код для этого достаточно прост, мне он не нужен, поскольку он в основном дублирует код (код тот же, за исключением += и -=).

Я пытаюсь создать небольшойслужебный класс, который обрабатывает это, имея функцию AddSubscription(EventHandler, EventHandler) и функцию UnsubscribeAll(), которая очищает все подписки, зарегистрированные AddSubscription:

public class EventSubscriber
{
    private readonly List<KeyValuePair<EventHandler, EventHandler>> _subscriptions = new List<KeyValuePair<EventHandler, EventHandler>>();

    public void AddSubscription(EventHandler toSubscribe, EventHandler subscriber)
    {
        toSubscribe += subscriber;
        _subscriptions.Add(new KeyValuePair<EventHandler, EventHandler>(toSubscribe, subscriber));
    }

    public void UnsubscribeAll()
    {
        foreach (KeyValuePair<EventHandler, EventHandler> subscription in _subscriptions)
        {
            EventHandler toSubscribe = subscription.Key;
            EventHandler subscriber = subscription.Value;
            toSubscribe -= subscriber;
        }
        _subscriptions.Clear();
    }
}

Однако мне не разрешено передавать события в AddSubscription():

EventSubscriber subscriber = new eventSubscriber();
subscriber.AddSubscription(_someControl.SomeEvent, OnSomeEvent);

Сбой при ошибке

Событие '....' может появляться только в левой части + = или - =

Можно ли как-нибудь избежать этого, или я лаю не на том дереве?

1 Ответ

1 голос
/ 14 июля 2011

На мой взгляд, вам не повезло, если для событий на вашем объекте нет специальных методов Add и Remove. Как вы уже узнали, вы не можете пройти мероприятие.
Моя идея использовать дерево выражений тоже не работает, потому что вы не можете иметь назначения в дереве выражений ...

Если вы используете WPF и хотите использовать его специально для событий элемента управления WPF, вы можете использовать методы AddHandler и RemoveHandler для достижения своей цели, например:

public class EventSubscriber
{
    private readonly List<Tuple<Control, RoutedEvent, Delegate>> 
        _subscriptions = 
            new List<Tuple<Control, RoutedEvent, Delegate>>();

    public void AddSubscription(Control control, RoutedEvent toSubscribe, 
                                Delegate subscriber)
    {
        control.AddHandler(toSubscribe, subscriber);
        _subscriptions.Add(Tuple.Create(control, toSubscribe, subscriber));
    }

    public void UnsubscribeAll()
    {
        foreach (var subscription in _subscriptions)
        {
            subscription.Item1.RemoveHandler(subscription.Item2,
                                             subscription.Item3);
        }
        _subscriptions.Clear();
    }
}

Непроверенные.

С WinForms вам снова не повезло.

...