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