Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Я понял это самостоятельно, следуя рекомендациям раздела "Примечания для наследователей" WeakEventManager. Вот базовая реализация WeakEventManager. Класс sourcing event называется 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;
    }
}

Ответ 2

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

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

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

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

Ограничения

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

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