Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.69 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Reflection;
  7.  
  8. namespace Revolucent.Dasso.Core
  9. {
  10.     [Serializable]
  11.     public class WeakEventManager<E>
  12.         where E : EventArgs
  13.     {
  14.         class WeakEventSubscriber : IEquatable<WeakEventSubscriber>
  15.         {
  16.             private readonly WeakReference target = null;
  17.             private MethodInfo method = null;
  18.  
  19.             public WeakEventSubscriber(Delegate del)
  20.             {
  21.                 target = new WeakReference(del.Target);
  22.                 method = del.Method;
  23.             }
  24.  
  25.             public bool IsAlive { get { return target.IsAlive; } }
  26.  
  27.             public void Invoke(object sender, E e)
  28.             {
  29.                 if (!IsAlive)
  30.                     return;
  31.                 method.Invoke(target.Target, new object[] { sender, e });
  32.             }
  33.  
  34.             public bool Equals(WeakEventSubscriber other)
  35.             {
  36.                 return Object.ReferenceEquals(target.Target, other.target.Target) && (method == other.method);
  37.             }
  38.         }
  39.  
  40.         private readonly List<WeakEventSubscriber> subscribers = new List<WeakEventSubscriber>();
  41.  
  42.         public void Add(Delegate del)
  43.         {
  44.             subscribers.Add(new WeakEventSubscriber(del));
  45.         }
  46.  
  47.         public void Remove(Delegate del)
  48.         {
  49.             subscribers.Remove(new WeakEventSubscriber(del));
  50.         }
  51.  
  52.         public void Invoke(object sender, E e)
  53.         {
  54.             subscribers.RemoveAll(subscriber => !subscriber.IsAlive);
  55.             subscribers.ForEach(subscriber => subscriber.Invoke(sender, e));
  56.         }
  57.     }
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement