Exemplo n.º 1
0
 /// <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;
 }
Exemplo n.º 2
0
        /// <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;
            }
        }
Exemplo n.º 3
0
        /// <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);
        }