using System; using System.Diagnostics; using System.Reflection; namespace ICSharpCode.TextEditor.Utils { /// /// http://paulstovell.com/blog/weakevents /// /// The type of the event args. [DebuggerNonUserCode] public sealed class WeakEventHandler where TEventArgs : EventArgs { private readonly WeakReference _targetReference; private readonly MethodInfo _method; public WeakEventHandler(EventHandler callback) { _method = callback.Method; _targetReference = new WeakReference(callback.Target, true); } [DebuggerNonUserCode] public void Handler(object sender, TEventArgs e) { var target = _targetReference.Target; if (target != null) { var callback = (Action)Delegate.CreateDelegate(typeof(Action), target, _method, true); if (callback != null) { callback(sender, e); } } } } }