.net weak-events weakeventmanager

Ejemplo de implementación de eventos débiles usando WeakEventManager de.NET



weak-events (2)

¿Hay una implementación de ejemplo de eventos débiles utilizando WeakEventManager de .NET?

Estoy intentando implementarlo siguiendo las "Notas a los herederos" en la documentación, pero es vago. Por ejemplo, no puedo averiguar cómo llamar a ProtectedAddListener desde mi función AddListener estática en mi administrador personalizado.


Lo resolví por mi cuenta siguiendo las pautas en la sección "Notas para herederos" de la documentación de WeakEventManager . Aquí hay una implementación básica de WeakEventManager . La clase que proporciona el evento se denomina PropertyValue y el evento se llama 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; } }


Sharp Observation es un proyecto de código abierto que tiene una implementación fácil de usar. Es posible que desee echar un vistazo a su código o simplemente utilizarlo como está.

Usage

El método MakeWeak () devuelve un nuevo delegado que invoca el mismo objetivo que el delegado original, pero mantiene una referencia débil al objetivo para que el oyente no mantenga vivo al oyente:

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

Limitations

La implementación actual tiene las siguientes restricciones para los delegados:

  • Los valores de retorno no son compatibles.
  • Los argumentos de salida y referencia no son compatibles.