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));
    }