【问题标题】:Example implementation of weak events using .NET's WeakEventManager使用 .NET 的 WeakEventManager 实现弱事件的示例
【发布时间】:2010-08-19 17:43:29
【问题描述】:

是否有使用 .NET 的 WeakEventManager 实现弱事件的示例?

我正在尝试按照文档中的“继承者说明”来实现它,但它含糊不清。例如,我无法弄清楚如何从自定义管理器中的静态 AddListener 函数调用 ProtectedAddListener

【问题讨论】:

    标签: .net weak-events weakeventmanager


    【解决方案1】:

    我按照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;
        }
    }
    

    【讨论】:

    • Microsoft 为 .NET 提供了 PropertyChangedEventManager (msdn.microsoft.com/en-us/library/…) 和 CollectionChangedEventManager (msdn.microsoft.com/en-us/library/…)。
    • 感谢您的示例。虽然较短的实现将是((PropertyValue)source).Changed += DeliverEvent;
    • @alpha-mouse:您的“较短实施”中的“弱点”到底在哪里?我找不到它。
    • @Paul Groke:我的评论与此答案的先前未编辑版本有关。现在我完全没有异议。
    【解决方案2】:

    Sharp Observation 是一个开源项目,具有易于使用的实现。您可能想看看他们的代码或直接使用它。

    Usage

    MakeWeak() 方法返回一个调用相同的新委托 目标作为原始委托,但持有对 目标,以便代理不会使侦听器保持活动状态:

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

    Limitations

    当前实现对委托有以下限制:

    • 不支持返回值。
    • 不支持 Out 和 Ref 的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-08
      • 2010-11-08
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2014-04-19
      相关资源
      最近更新 更多