/// <summary> /// Constructs a new WeakEventHandler /// </summary> /// <param name="eventHandler">The Event handler</param> /// <param name="unregister">Unregister delegate</param> public WeakEventHandler(EventHandler <E> eventHandler, UnregisterWeakCallback <E> unregister) { _TargetRef = new WeakReference(eventHandler.Target); _OpenHandler = (OpenEventHandler)Delegate.CreateDelegate(typeof(OpenEventHandler), null, eventHandler.Method); _Handler = Invoke; _Unregister = unregister; }
/// <summary> /// Invokes the event handler if the source is still alive /// </summary> public void Invoke(object sender, E e) { T target = (T)_TargetRef.Target; if (target != null) { _OpenHandler.Invoke(target, sender, e); } else if (_Unregister != null) { _Unregister(_Handler); _Unregister = null; } }
/// <summary> /// Sxtesion method for EventHandler<E> /// </summary> /// <typeparam name="E">The type</typeparam> /// <param name="eventHandler">The EventHandler</param> /// <param name="unregister">EventHandler unregister delegate</param> /// <returns>An EventHandler</returns> public static EventHandler <E> MakeWeak <E>(this EventHandler <E> eventHandler, UnregisterWeakCallback <E> unregister) where E : EventArgs { if (eventHandler == null) { throw new ArgumentNullException("eventHandler"); } if (eventHandler.Method.IsStatic || eventHandler.Target == null) { throw new ArgumentException("Only instance methods are supported.", "eventHandler"); } Type wehType = typeof(WeakEventHandler <,>).MakeGenericType(eventHandler.Method.DeclaringType, typeof(E)); ConstructorInfo wehConstructor = wehType.GetConstructor(new Type[] { typeof(EventHandler <E>), typeof(UnregisterWeakCallback <E>) }); IWeakEventHandler <E> weh = (IWeakEventHandler <E>)wehConstructor.Invoke(new object[] { eventHandler, unregister }); return(weh.Handler); }