使用.NET的WeakEventManager实现弱事件的示例

M. *_*ley 25 .net weak-events weakeventmanager

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

我正在尝试通过遵循文档中的"Notes to Inheritors"来实现它,但它很模糊.例如,我无法弄清楚如何ProtectedAddListenerAddListener我的自定义管理器中的静态函数调用.

M. *_*ley 28

我按照WeakEventManager文档的"Notes for Inheritors"部分中的指导原则自行计算出来.这是一个基本的实现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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Microsoft提供了PropertyChangedEventManager(http://msdn.microsoft.com/en-us/library/system.componentmodel.propertychangedeventmanager.aspx)和CollectionChangedEventManager(http://msdn.microsoft.com/en-us/library/system.collections .specialized.collectionchangedeventmanager.aspx)内置于.NET. (10认同)
  • 谢谢你的例子.虽然较短的实现将是`((PropertyValue)source).Changed + = DeliverEvent;` (4认同)

ang*_*sen 7

Sharp Observation是一个开源项目,具有易于使用的实现.您可能想看看他们的代码或只是按原样使用它.

用法

MakeWeak()方法返回一个新的委托,它调用与原始委托相同的目标,但保留对目标的弱引用,以便委托不使监听器保持活动状态:

var handler= new PropertyChangingEventHandler(listener.HandleChange);
observable.PropertyChanging += handler.MakeWeak<PropertyChangingEventHandler>();
Run Code Online (Sandbox Code Playgroud)

限制

当前实现对代表有以下限制:

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