예제 #1
0
        private static TUserData GetUserData <TUserData> (GetMultiDelegateDelegate multi)
        {
            var userDataDelegate = (UserDataDelegate)multi.Invoke(typeof(UserDataDelegate));
            var value            = userDataDelegate.Invoke();

            return(value is WeakReference weak ? (TUserData)weak.Target : (TUserData)value);
        }
예제 #2
0
        public static IntPtr CreateMulti <T1, T2, T3> (T1 wrappedDelegate1, T2 wrappedDelegate2, T3 wrappedDelegate3)
            where T1 : Delegate
            where T2 : Delegate
            where T3 : Delegate
        {
            var del = new GetMultiDelegateDelegate((type) => {
                if (type == typeof(T1))
                {
                    return(wrappedDelegate1);
                }
                if (type == typeof(T2))
                {
                    return(wrappedDelegate2);
                }
                if (type == typeof(T3))
                {
                    return(wrappedDelegate3);
                }
                throw new ArgumentOutOfRangeException(nameof(type));
            });

            Create(del, out _, out var ctx);

            return(ctx);
        }
예제 #3
0
        public static IntPtr CreateMultiUserData <T1, T2, T3> (T1 wrappedDelegate1, T2 wrappedDelegate2, T3 wrappedDelegate3, object userData, bool makeWeak = false)
            where T1 : Delegate
            where T2 : Delegate
            where T3 : Delegate
        {
            userData = makeWeak ? new WeakReference(userData) : userData;
            var userDataDelegate = new UserDataDelegate(() => userData);

            var del = new GetMultiDelegateDelegate((type) => {
                if (type == typeof(T1))
                {
                    return(wrappedDelegate1);
                }
                if (type == typeof(T2))
                {
                    return(wrappedDelegate2);
                }
                if (type == typeof(T3))
                {
                    return(wrappedDelegate3);
                }
                if (type == typeof(UserDataDelegate))
                {
                    return(userDataDelegate);
                }
                throw new ArgumentOutOfRangeException(nameof(type));
            });

            Create(del, out _, out var ctx);

            return(ctx);
        }
예제 #4
0
        public static IntPtr CreateMulti <T> (T wrappedDelegate, ReleaseDelegate destroy)
            where T : Delegate
        {
            var del = new GetMultiDelegateDelegate((type) => {
                if (type == typeof(T))
                {
                    return(wrappedDelegate);
                }
                if (type == typeof(ReleaseDelegate))
                {
                    return(destroy);
                }
                throw new ArgumentOutOfRangeException(nameof(type));
            });

            Create(del, out _, out var ctx);

            return(ctx);
        }
예제 #5
0
        public static IntPtr CreateMulti <T> (T wrappedDelegate, object context, ReleaseDelegate destroy)
            where T : Delegate
        {
            var destroyDelegate = destroy != null && context != null
                                ? new ReleaseDelegate((_) => destroy(context))
                                : destroy;

            var del = new GetMultiDelegateDelegate((type) => {
                if (type == typeof(T))
                {
                    return(wrappedDelegate);
                }
                if (type == typeof(ReleaseDelegate))
                {
                    return(destroyDelegate);
                }
                throw new ArgumentOutOfRangeException(nameof(type));
            });

            Create(del, out _, out var ctx);

            return(ctx);
        }