static TEventHandler MakeDeregisterCodeAndWeakEventHandler <TEventSource, TEventListener> ( WeakEventHandler weh, TEventSource senderObject, Action <TEventSource, TEventHandler> deregisterEvent, Action <TEventListener, object, TEventArgs> forwarderAction ) where TEventSource : class where TEventListener : class { Action <object, TEventArgs> eventHandler = (sender, args) => { TEventListener listeningObject = (TEventListener)weh.listeningReference.Target; if (listeningObject != null) { forwarderAction(listeningObject, sender, args); } else { weh.Deregister(); } }; weh.deregisterCode = delegate { deregisterEvent(senderObject, ConvertDelegate(eventHandler)); }; return(ConvertDelegate(eventHandler)); }