我可以在课堂上说:
public delegate bool MyFunc(int param);
我怎么能这样做
someObj.PassMeADelegateToExamine(this.MyFunc); // not possible!?!
所以我可以检查委托,也许使用反射或idk来找出它的返回类型和它可能有的任何参数?
基本上,如果我可以将它转换为一个(不可赎回的)Action对象,它将会变得非常盛大
答案 0 :(得分:2)
“prototype”只是一个新的Type定义 - 它不是你直接使用的实际实例。在您的情况下,MyFunc是委托Type
,而不是实际的委托。
你可以这样做:
void PassMeADelegateTypeToExamine(Type type) { ... }
然后叫它:
someObj.PassMeADelegateTypeToExamine(MyFunc);
答案 1 :(得分:0)
委托声明是类型声明,就像struct
和class
一样。所以你可以使用
typeof(MyFunc)
要查找委托的返回类型和参数,您必须查看委托类型的Invoke
方法:
MethodInfo invokeMethod = typeof(MyFunc).GetMethod("Invoke");
Type returnType = invokeMethod.ReturnType;
ParameterInfo[] parameterInfos = invokeMethod.GetParameters();
委托几乎是一个使用Invoke
等传统方法的类。当您使用像这样的委托实例时
func(args)
这是内部翻译为
func.Invoke(args)
这就是为什么反射命名空间中没有特殊的 DelegateInfo 类型的原因:Invoke
方法的 MethodInfo 告诉您所需要的一切。
现在,如果您想动态调用委托实例,可以使用反射并在 MethodInfo 上调用Invoke
,或者确保将您的委托变量键入为委派,可让您访问DynamicInvoke
方法:
Delegate func = ...;
object result = func.DynamicInvoke(arg1, arg2);