Пример реализации слабых событий с использованием WeakEventManager .NET - PullRequest
25 голосов
/ 19 августа 2010

Есть ли пример реализации слабых событий с использованием WeakEventManager .NET ?

Я пытаюсь реализовать его, следуя "Примечания к наследникам" в документации, норасплывчатый.Например, я не могу понять, как вызвать ProtectedAddListener из моей статической функции AddListener в моем собственном менеджере.

Ответы [ 2 ]

28 голосов
/ 20 августа 2010

Я понял это самостоятельно, следуя рекомендациям в разделе «Примечания для наследников» документации WeakEventManager . Вот базовая реализация WeakEventManager. Класс, использующий событие, называется PropertyValue, а событие - Changed.

public class PropertyValueChangedEventManager : WeakEventManager
{
    public static PropertyValueChangedEventManager CurrentManager
    {
        get
        {
            var manager_type = typeof(PropertyValueChangedEventManager);
            var manager = WeakEventManager.GetCurrentManager(manager_type) as PropertyValueChangedEventManager;

            if (manager == null)
            {
                manager = new PropertyValueChangedEventManager();
                WeakEventManager.SetCurrentManager(manager_type, manager);
            }

            return manager;
        }
    }

    public static void AddListener(PropertyValue source, IWeakEventListener listener)
    {
        CurrentManager.ProtectedAddListener(source, listener);
    }

    public static void RemoveListener(PropertyValue source, IWeakEventListener listener)
    {
        CurrentManager.ProtectedRemoveListener(source, listener);
    }

    protected override void StartListening(object source)
    {
        ((PropertyValue)source).Changed += DeliverEvent;
    }

    protected override void StopListening(object source)
    {
        ((PropertyValue)source).Changed -= DeliverEvent;
    }
}
6 голосов
/ 03 ноября 2011

Sharp Observation - проект с открытым исходным кодом, имеющий простую в использовании реализацию.Возможно, вы захотите взглянуть на их код или просто использовать его как есть.

Использование

MakeWeak ()Метод возвращает новый делегат, который вызывает ту же цель, что и исходный делегат, но содержит слабую ссылку на цель, так что делегат не поддерживает работу слушателя:

var handler= new PropertyChangingEventHandler(listener.HandleChange);
observable.PropertyChanging += handler.MakeWeak<PropertyChangingEventHandler>();

Ограничения

Текущая реализация имеет следующие ограничения для делегатов:

  • Возвращаемые значения не поддерживаются.
  • Аргументы Out и Ref не поддерживаются.
...