Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Linq;
- using System.Text;
- using System.Reflection;
- namespace Revolucent.Dasso.Core
- {
- [Serializable]
- public class WeakEventManager<E>
- where E : EventArgs
- {
- class WeakEventSubscriber : IEquatable<WeakEventSubscriber>
- {
- private readonly WeakReference target = null;
- private MethodInfo method = null;
- public WeakEventSubscriber(Delegate del)
- {
- target = new WeakReference(del.Target);
- method = del.Method;
- }
- public bool IsAlive { get { return target.IsAlive; } }
- public void Invoke(object sender, E e)
- {
- if (!IsAlive)
- return;
- method.Invoke(target.Target, new object[] { sender, e });
- }
- public bool Equals(WeakEventSubscriber other)
- {
- return Object.ReferenceEquals(target.Target, other.target.Target) && (method == other.method);
- }
- }
- private readonly List<WeakEventSubscriber> subscribers = new List<WeakEventSubscriber>();
- public void Add(Delegate del)
- {
- subscribers.Add(new WeakEventSubscriber(del));
- }
- public void Remove(Delegate del)
- {
- subscribers.Remove(new WeakEventSubscriber(del));
- }
- public void Invoke(object sender, E e)
- {
- subscribers.RemoveAll(subscriber => !subscriber.IsAlive);
- subscribers.ForEach(subscriber => subscriber.Invoke(sender, e));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement