您始终可以接受通用委托。代表都来自System.Delegate
using System;
public class Program
{
public delegate R Deleg1<R,T1>(T1 arg);
public delegate R Deleg2<R,T1,T2>(T1 arg1, T2 arg2);
public delegate R Deleg3<R,T1,T2,T3>(T1 arg1, T2 arg2, T3 arg3);
public static void AcceptAny<R,T1>(Deleg1<R,T1> del) { /**/ }
public static void AcceptAny<R,T1,T2>(Deleg2<R,T1,T2> del) { /**/ }
public static void AcceptAny<R,T1,T2,T3>(Deleg3<R,T1,T2,T3> del) { /**/ }
public static void Main(string[] args)
{
}
}
如果你不介意一点点擦除,你可以
public delegate R DelegParams<R>(params object[] @params);
public static void AcceptAny<R>(DelegParams<R> paramsFunc) { /**/ }
您可以间接将大多数委托分配给此签名,方法是使用 lambda 表达式包装它(很像 Jon Skeet 展示的 Action 方法)。
请注意,委托共享一个公共基类,并允许您使用“类似反射”的接口调用它们(例如,将通用 object[] 作为参数):Delegate.DynamicInvoke Method