Пример #1
0
        private string GetFile(string methodPostfix, string methodDescription, string typePrefix) =>
        $@"
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

namespace Enderlook.EventManager
{{
    public sealed partial class EventManager
    {{
        {EventManagerGeneratorHelper.GetStrongSubscribeSummary(methodDescription)}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.StrongExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Subscribe{methodPostfix}<TEvent>(Action<TEvent> callback)
        {{
            if (callback is null)
                ThrowNullCallbackException();

            Subscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObject, StrongActionArgument<TEvent>>, InvariantObject>(new(callback));
        }}

        {EventManagerGeneratorHelper.GetStrongSubscribeSummary(methodDescription)}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.StrongExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Subscribe{methodPostfix}<TEvent>(Action callback)
        {{
            if (callback is null)
                ThrowNullCallbackException();

            Subscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObject, StrongActionVoid<TEvent>>, InvariantObject>(new(callback));
        }}

        {EventManagerGeneratorHelper.GetStrongSubscribeSummary(methodDescription)}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.StrongExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Subscribe{methodPostfix}<TEvent, TClosure>(TClosure? closure, Action<TClosure?, TEvent> callback)
        {{
            if (callback is null)
                ThrowNullCallbackException();

            if (typeof(TClosure).IsValueType)
                Subscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndT<TClosure?>, StrongInvariantObjectAndTVoid<TClosure, TEvent>>, InvariantObjectAndT<TClosure?>>(new(callback, closure));
            else
                Subscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndT<object?>, StrongInvariantObjectAndTVoid<object?, TEvent>>, InvariantObjectAndT<object?>>(new(callback, closure));
        }}

        {EventManagerGeneratorHelper.GetStrongSubscribeSummary(methodDescription)}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.StrongExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Subscribe{methodPostfix}<TEvent, TClosure>(TClosure? closure, Action<TClosure?> callback)
        {{
            if (callback is null)
                ThrowNullCallbackException();

            if (typeof(TClosure).IsValueType)
                Subscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndT<TClosure?>, StrongInvariantObjectAndTVoid<TClosure, TEvent>>, InvariantObjectAndT<TClosure?>>(new(callback, closure));
            else
                Subscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndT<object?>, StrongInvariantObjectAndTVoid<object?, TEvent>>, InvariantObjectAndT<object?>>(new(callback, closure));
        }}

        {EventManagerGeneratorHelper.GetStrongUnsubscribeSummary($"Subscribe{methodPostfix}{{TEvent}}(Action{{TEvent}})")}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.StrongExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Unsubscribe{methodPostfix}<TEvent>(Action<TEvent> callback)
        {{
            if (callback is null)
                ThrowNullCallbackException();

            Unsubscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObject, StrongActionArgument<TEvent>>, InvariantObjectComparer<Action<TEvent>>, InvariantObject>(new(new(callback)));
        }}

        {EventManagerGeneratorHelper.GetStrongUnsubscribeSummary($"Subscribe{methodPostfix}{{TEvent}}(Action)")}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.StrongExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Unsubscribe{methodPostfix}<TEvent>(Action callback)
        {{
            if (callback is null)
                ThrowNullCallbackException();

            Unsubscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObject, StrongActionVoid<TEvent>>, InvariantObjectComparer<Action>, InvariantObject>(new(new(callback)));
        }}

        {EventManagerGeneratorHelper.GetStrongUnsubscribeSummary($"Subscribe{methodPostfix}{{TEvent, TClosure}}(TClosure, Action{{TClosure, TEvent}})")}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.StrongExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Unsubscribe{methodPostfix}<TEvent, TClosure>(TClosure? closure, Action<TClosure?, TEvent> callback)
        {{
            if (callback is null)
                ThrowNullCallbackException();

            if (typeof(TClosure).IsValueType)
                Unsubscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndT<TClosure?>, StrongInvariantObjectAndTArgument<TClosure, TEvent>>, StrongValueClosureActionComparer<TClosure?, TEvent>, InvariantObjectAndT<TClosure?>>(new(new(callback, closure)));
            else
                Unsubscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndT<object?>, StrongInvariantObjectAndTArgument<object?, TEvent>>, StrongReferenceClosureActionComparer<TClosure?, TEvent>, InvariantObjectAndT<object?>>(new(new(callback, closure)));
        }}

        {EventManagerGeneratorHelper.GetStrongUnsubscribeSummary($"Subscribe{methodPostfix}{{TEvent, TClosure}}(TClosure, Action{{TClosure}})")}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.StrongExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void Unsubscribe{methodPostfix}<TEvent, TClosure>(TClosure? closure, Action<TClosure?> callback)
        {{
            if (callback is null)
                ThrowNullCallbackException();

            if (typeof(TClosure).IsValueType)
                Unsubscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndT<TClosure?>, StrongInvariantObjectAndTVoid<TClosure, TEvent>>, StrongValueClosureActionComparer<TClosure?>, InvariantObjectAndT<TClosure?>>(new(new(callback, closure)));
            else
                Unsubscribe<TEvent, Strong{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndT<object?>, StrongInvariantObjectAndTVoid<object?, TEvent>>, StrongReferenceClosureActionComparer<TClosure?>, InvariantObjectAndT<object?>>(new(new(callback, closure)));
        }}
    }}
}}
";
        private string GetFile(string methodPostfix, string methodDescription, string typePrefix)
        {
            return($@"
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

namespace Enderlook.EventManager
{{
    public sealed partial class EventManager
    {{
        {EventManagerGeneratorHelper.GetWeakSubscribeSummaryAndHandleParameter(methodDescription)}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.TrackResurrectionParameter}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakSubscribe{methodPostfix}<THandle, TEvent>(THandle handle, Action<TEvent> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
                Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandleTrackResurrection, WeakActionArgument<TEvent>>, InvariantObjectAndGCHandleTrackResurrection>(new(callback, handle));
            else
                Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandle, WeakActionArgument<TEvent>>, InvariantObjectAndGCHandle>(new(callback, handle));
        }}

        {EventManagerGeneratorHelper.GetWeakSubscribeSummaryAndHandleParameter(methodDescription)}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.TrackResurrectionParameter}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakSubscribe{methodPostfix}<THandle, TEvent>(THandle handle, Action callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
                Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandleTrackResurrection, WeakActionVoid<TEvent>>, InvariantObjectAndGCHandleTrackResurrection>(new(callback, handle));
            else
                Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandle, WeakActionVoid<TEvent>>, InvariantObjectAndGCHandle>(new(callback, handle));
        }}

        {EventManagerGeneratorHelper.GetWeakSubscribeSummaryAndHandleParameter(methodDescription)}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.TrackResurrectionParameter}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakSubscribe{methodPostfix}<THandle, TClosure, TEvent>(THandle handle, TClosure? closure, Action<TClosure?, TEvent> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
            {{
                if (typeof(TClosure).IsValueType)
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>, WeakInvariantObjectAndTArgument<TClosure?, TEvent>>, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>>(new(callback, handle, closure));
                else
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<object?>, WeakInvariantObjectAndTArgument<object?, TEvent>>, InvariantObjectAndTAndGCHandleTrackResurrection<object?>>(new(callback, handle, closure));
            }}
            else
            {{
                if (typeof(TClosure).IsValueType)
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<TClosure?>, WeakInvariantObjectAndTArgument<TClosure?, TEvent>>, InvariantObjectAndTAndGCHandle<TClosure?>>(new(callback, handle, closure));
                else
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<object?>, WeakInvariantObjectAndTArgument<object?, TEvent>>, InvariantObjectAndTAndGCHandle<object?>>(new(callback, handle, closure));
            }}
        }}

        {EventManagerGeneratorHelper.GetWeakSubscribeSummaryAndHandleParameter(methodDescription)}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.TrackResurrectionParameter}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakSubscribe{methodPostfix}<THandle, TClosure, TEvent>(THandle handle, TClosure? closure, Action<TClosure?> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
            {{
                if (typeof(TClosure).IsValueType)
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>, WeakInvariantObjectAndTVoid<TClosure?, TEvent>>, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>>(new(callback, handle, closure));
                else
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<object?>, WeakInvariantObjectAndTVoid<object?, TEvent>>, InvariantObjectAndTAndGCHandleTrackResurrection<object?>>(new(callback, handle, closure));
            }}
            else
            {{
                if (typeof(TClosure).IsValueType)
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<TClosure?>, WeakInvariantObjectAndTVoid<TClosure?, TEvent>>, InvariantObjectAndTAndGCHandle<TClosure?>>(new(callback, handle, closure));
                else
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<object?>, WeakInvariantObjectAndTVoid<object?, TEvent>>, InvariantObjectAndTAndGCHandle<object?>>(new(callback, handle, closure));
            }}
        }}

        {EventManagerGeneratorHelper.GetWeakSubscribeSummaryAndHandleParameter(methodDescription)}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.TrackResurrectionParameter}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakSubscribe{methodPostfix}<THandle, TClosure, TEvent>(THandle handle, TClosure? closure, Action<THandle, TClosure?, TEvent> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
            {{
                if (typeof(TClosure).IsValueType)
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>, WeakInvariantObjectAndTArgumentWithHandle<TClosure?, TEvent>>, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>>(new(callback, handle, closure));
                else
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<object?>, WeakInvariantObjectAndTArgumentWithHandle<object?, TEvent>>, InvariantObjectAndTAndGCHandleTrackResurrection<object?>>(new(callback, handle, closure));
            }}
            else
            {{
                if (typeof(TClosure).IsValueType)
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<TClosure?>, WeakInvariantObjectAndTArgumentWithHandle<TClosure?, TEvent>>, InvariantObjectAndTAndGCHandle<TClosure?>>(new(callback, handle, closure));
                else
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<object?>, WeakInvariantObjectAndTArgumentWithHandle<object?, TEvent>>, InvariantObjectAndTAndGCHandle<object?>>(new(callback, handle, closure));
            }}
        }}

        {EventManagerGeneratorHelper.GetWeakSubscribeSummaryAndHandleParameter(methodDescription)}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.TrackResurrectionParameter}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakSubscribe{methodPostfix}<THandle, TClosure, TEvent>(THandle handle, TClosure? closure, Action<THandle, TClosure?> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
            {{
                if (typeof(TClosure).IsValueType)
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>, WeakInvariantObjectAndTVoidWithHandle<TClosure?, TEvent>>, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>>(new(callback, handle, closure));
                else
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<object?>, WeakInvariantObjectAndTVoidWithHandle<object?, TEvent>>, InvariantObjectAndTAndGCHandleTrackResurrection<object?>>(new(callback, handle, closure));
            }}
            else
            {{
                if (typeof(TClosure).IsValueType)
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<TClosure?>, WeakInvariantObjectAndTVoidWithHandle<TClosure?, TEvent>>, InvariantObjectAndTAndGCHandle<TClosure?>>(new(callback, handle, closure));
                else
                    Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<object?>, WeakInvariantObjectAndTVoidWithHandle<object?, TEvent>>, InvariantObjectAndTAndGCHandle<object?>>(new(callback, handle, closure));
            }}
        }}

        {EventManagerGeneratorHelper.GetWeakSubscribeSummaryAndHandleParameter(methodDescription)}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.TrackResurrectionParameter}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakSubscribe{methodPostfix}<THandle, TEvent>(THandle handle, Action<THandle, TEvent> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
                Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandleTrackResurrection, WeakActionHandleArgument<THandle, TEvent>>, InvariantObjectAndGCHandleTrackResurrection>(new(callback, handle));
            else
                Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandle, WeakActionHandleArgument<THandle, TEvent>>, InvariantObjectAndGCHandle>(new(callback, handle));
        }}

        {EventManagerGeneratorHelper.GetWeakSubscribeSummaryAndHandleParameter(methodDescription)}
        {EventManagerGeneratorHelper.CallbackParameter}
        {EventManagerGeneratorHelper.TrackResurrectionParameter}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakSubscribe{methodPostfix}<THandle, TEvent>(THandle handle, Action<THandle> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
                Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandleTrackResurrection, WeakActionHandleVoid<THandle, TEvent>>, InvariantObjectAndGCHandleTrackResurrection>(new(callback, handle));
            else
                Subscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandle, WeakActionHandleVoid<THandle, TEvent>>, InvariantObjectAndGCHandle>(new(callback, handle));
        }}

        {EventManagerGeneratorHelper.GetWeakUnsubscribeSummary($"WeakSubscribe{methodPostfix}{{THandle, TEvent}}(THandle, Action{{TEvent}}, bool)")}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.TrackResurrectionParameterUnsubscribe}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakUnsubscribe{methodPostfix}<THandle, TEvent>(THandle handle, Action<TEvent> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
                Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandleTrackResurrection, WeakActionVoid<TEvent>>, InvariantObjectAndGCHandleComparer<Action<TEvent>, THandle>, InvariantObjectAndGCHandleTrackResurrection>(new(callback, handle));
            else
                Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandle, WeakActionVoid<TEvent>>, InvariantObjectAndGCHandleComparer<Action<TEvent>, THandle>, InvariantObjectAndGCHandle>(new(callback, handle));
        }}

        {EventManagerGeneratorHelper.GetWeakUnsubscribeSummary($"WeakSubscribe{methodPostfix}{{THandle, TEvent}}(THandle, Action, bool)")}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.TrackResurrectionParameterUnsubscribe}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakUnsubscribe{methodPostfix}<THandle, TEvent>(THandle handle, Action callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
                Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandleTrackResurrection, WeakActionVoid<TEvent>>, InvariantObjectAndGCHandleComparer<Action, THandle>, InvariantObjectAndGCHandleTrackResurrection>(new(callback, handle));
            else
                Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandle, WeakActionVoid<TEvent>>, InvariantObjectAndGCHandleComparer<Action, THandle>, InvariantObjectAndGCHandle>(new(callback, handle));
        }}

        {EventManagerGeneratorHelper.GetWeakUnsubscribeSummary($"WeakSubscribe{methodPostfix}{{THandle, TClosure, TEvent}}(THandle, TClosure, Action{{TClosure, TEvent}}, bool)")}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.TrackResurrectionParameterUnsubscribe}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakUnsubscribe{methodPostfix}<THandle, TClosure, TEvent>(THandle handle, TClosure? closure, Action<TClosure?, TEvent> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
            {{
                if (typeof(TClosure).IsValueType)
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>, WeakInvariantObjectAndTArgument<TClosure?, TEvent>>, InvariantObjectAndValueTAndGCHandleComparer<Action<TClosure?, TEvent>, TClosure?, THandle>, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>>(new(callback, closure, handle));
                else
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<object?>, WeakInvariantObjectAndTArgument<object?, TEvent>>, InvariantObjectAndReferenceTAndGCHandleComparer<Action<TClosure?, TEvent>, TClosure?, THandle>, InvariantObjectAndTAndGCHandleTrackResurrection<object?>>(new(callback, closure, handle));
            }}
            else
            {{
                if (typeof(TClosure).IsValueType)
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<TClosure?>, WeakInvariantObjectAndTArgument<TClosure?, TEvent>>, InvariantObjectAndValueTAndGCHandleComparer<Action<TClosure?, TEvent>, TClosure?, THandle>, InvariantObjectAndTAndGCHandle<TClosure?>>(new(callback, closure, handle));
                else
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<object?>, WeakInvariantObjectAndTArgument<object?, TEvent>>, InvariantObjectAndReferenceTAndGCHandleComparer<Action<TClosure?, TEvent>, TClosure?, THandle>, InvariantObjectAndTAndGCHandle<object?>>(new(callback, closure, handle));
            }}
        }}

        {EventManagerGeneratorHelper.GetWeakUnsubscribeSummary($"WeakSubscribe{methodPostfix}{{THandle, TClosure, TEvent}}(THandle, TClosure, Action{{TClosure}}, bool)")}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.TrackResurrectionParameterUnsubscribe}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakUnsubscribe{methodPostfix}<THandle, TClosure, TEvent>(THandle handle, TClosure? closure, Action<TClosure?> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
            {{
                if (typeof(TClosure).IsValueType)
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>, WeakInvariantObjectAndTVoid<TClosure?, TEvent>>, InvariantObjectAndValueTAndGCHandleComparer<Action<TClosure?>, TClosure?, THandle>, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>>(new(callback, closure, handle));
                else
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<object?>, WeakInvariantObjectAndTVoid<object?, TEvent>>, InvariantObjectAndReferenceTAndGCHandleComparer<Action<TClosure?>, TClosure?, THandle>, InvariantObjectAndTAndGCHandleTrackResurrection<object?>>(new(callback, closure, handle));
            }}
            else
            {{
                if (typeof(TClosure).IsValueType)
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<TClosure?>, WeakInvariantObjectAndTVoid<TClosure?, TEvent>>, InvariantObjectAndValueTAndGCHandleComparer<Action<TClosure?>, TClosure?, THandle>, InvariantObjectAndTAndGCHandle<TClosure?>>(new(callback, closure, handle));
                else
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<object?>, WeakInvariantObjectAndTVoid<object?, TEvent>>, InvariantObjectAndReferenceTAndGCHandleComparer<Action<TClosure?>, TClosure?, THandle>, InvariantObjectAndTAndGCHandle<object?>>(new(callback, closure, handle));
            }}
        }}

        {EventManagerGeneratorHelper.GetWeakUnsubscribeSummary($"WeakSubscribe{methodPostfix}{{THandle, TClosure, TEvent}}(THandle, TClosure, Action{{THandle, TClosure, TEvent}}, bool)")}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.TrackResurrectionParameterUnsubscribe}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakUnsubscribe{methodPostfix}<THandle, TClosure, TEvent>(THandle handle, TClosure? closure, Action<THandle, TClosure?, TEvent> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
            {{
                if (typeof(TClosure).IsValueType)
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>, WeakInvariantObjectAndTArgumentWithHandle<TClosure?, TEvent>>, InvariantObjectAndValueTAndGCHandleComparer<Action<THandle, TClosure?, TEvent>, TClosure?, THandle>, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>>(new(callback, closure, handle));
                else
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<object?>, WeakInvariantObjectAndTArgumentWithHandle<object?, TEvent>>, InvariantObjectAndReferenceTAndGCHandleComparer<Action<THandle, TClosure?, TEvent>, TClosure?, THandle>, InvariantObjectAndTAndGCHandleTrackResurrection<object?>>(new(callback, closure, handle));
            }}
            else
            {{
                if (typeof(TClosure).IsValueType)
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<TClosure?>, WeakInvariantObjectAndTArgumentWithHandle<TClosure?, TEvent>>, InvariantObjectAndValueTAndGCHandleComparer<Action<THandle, TClosure?, TEvent>, TClosure?, THandle>, InvariantObjectAndTAndGCHandle<TClosure?>>(new(callback, closure, handle));
                else
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<object?>, WeakInvariantObjectAndTArgumentWithHandle<object?, TEvent>>, InvariantObjectAndReferenceTAndGCHandleComparer<Action<THandle, TClosure?, TEvent>, TClosure?, THandle>, InvariantObjectAndTAndGCHandle<object?>>(new(callback, closure, handle));
            }}
        }}

        {EventManagerGeneratorHelper.GetWeakUnsubscribeSummary($"WeakSubscribe{methodPostfix}{{THandle, TClosure, TEvent}}(THandle, TClosure, Action{{THandle, TClosure}}, bool)")}
        {EventManagerGeneratorHelper.ClosureParameter}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.TrackResurrectionParameterUnsubscribe}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakUnsubscribe{methodPostfix}<THandle, TClosure, TEvent>(THandle handle, TClosure? closure, Action<THandle, TClosure?> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
            {{
                if (typeof(TClosure).IsValueType)
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>, WeakInvariantObjectAndTVoidWithHandle<TClosure?, TEvent>>, InvariantObjectAndValueTAndGCHandleComparer<Action<THandle, TClosure?>, TClosure?, THandle>, InvariantObjectAndTAndGCHandleTrackResurrection<TClosure?>>(new(callback, closure, handle));
                else
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandleTrackResurrection<object?>, WeakInvariantObjectAndTVoidWithHandle<object?, TEvent>>, InvariantObjectAndReferenceTAndGCHandleComparer<Action<THandle, TClosure?>, TClosure?, THandle>, InvariantObjectAndTAndGCHandleTrackResurrection<object?>>(new(callback, closure, handle));
            }}
            else
            {{
                if (typeof(TClosure).IsValueType)
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<TClosure?>, WeakInvariantObjectAndTVoidWithHandle<TClosure?, TEvent>>, InvariantObjectAndValueTAndGCHandleComparer<Action<THandle, TClosure?>, TClosure?, THandle>, InvariantObjectAndTAndGCHandle<TClosure?>>(new(callback, closure, handle));
                else
                    Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndTAndGCHandle<object?>, WeakInvariantObjectAndTVoidWithHandle<object?, TEvent>>, InvariantObjectAndReferenceTAndGCHandleComparer<Action<THandle, TClosure?>, TClosure?, THandle>, InvariantObjectAndTAndGCHandle<object?>>(new(callback, closure, handle));
            }}
        }}

        {EventManagerGeneratorHelper.GetWeakUnsubscribeSummary($"WeakSubscribe{methodPostfix}{{THandle, TEvent}}(THandle, Action{{THandle, TEvent}}, bool)")}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.TrackResurrectionParameterUnsubscribe}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakUnsubscribe{methodPostfix}<THandle, TEvent>(THandle handle, Action<THandle, TEvent> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
                Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandleTrackResurrection, WeakActionHandleArgument<THandle, TEvent>>, InvariantObjectAndGCHandleComparer<Action<THandle, TEvent>, THandle>, InvariantObjectAndGCHandleTrackResurrection>(new(callback, handle));
            else
                Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandle, WeakActionHandleArgument<THandle, TEvent>>, InvariantObjectAndGCHandleComparer<Action<THandle, TEvent>, THandle>, InvariantObjectAndGCHandle>(new(callback, handle));
        }}

        {EventManagerGeneratorHelper.GetWeakUnsubscribeSummary($"WeakSubscribe{methodPostfix}{{THandle, TEvent}}(THandle, Action{{THandle}}, bool)")}
        {EventManagerGeneratorHelper.CallbackParameterUnsubscribe}
        {EventManagerGeneratorHelper.TrackResurrectionParameterUnsubscribe}
        {EventManagerGeneratorHelper.WeakExceptions}
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WeakUnsubscribe{methodPostfix}<THandle, TEvent>(THandle handle, Action<THandle> callback, bool trackResurrection)
            where THandle : class
        {{
            if (callback is null)
                ThrowNullCallbackException();
            if (handle is null)
                ThrowNullHandleException();

            if (trackResurrection)
                Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandleTrackResurrection, WeakActionHandleVoid<THandle, TEvent>>, InvariantObjectAndGCHandleComparer<Action<THandle>, THandle>, InvariantObjectAndGCHandleTrackResurrection>(new(callback, handle));
            else
                Unsubscribe<TEvent, Weak{typePrefix}CallbackExecuter<TEvent, InvariantObjectAndGCHandle, WeakActionHandleVoid<THandle, TEvent>>, InvariantObjectAndGCHandleComparer<Action<THandle>, THandle>, InvariantObjectAndGCHandle>(new(callback, handle));
        }}
    }}
}}
");
        }