我如何将委托原型传递给方法?

时间:2010-03-31 22:42:00

标签: c# .net delegates

我可以在课堂上说:

public delegate bool MyFunc(int param);

我怎么能这样做

someObj.PassMeADelegateToExamine(this.MyFunc); // not possible!?!

所以我可以检查委托,也许使用反射或idk来找出它的返回类型和它可能有的任何参数?

基本上,如果我可以将它转换为一个(不可赎回的)Action对象,它将会变得非常盛大

2 个答案:

答案 0 :(得分:2)

“prototype”只是一个新的Type定义 - 它不是你直接使用的实际实例。在您的情况下,MyFunc是委托Type,而不是实际的委托。

你可以这样做:

void PassMeADelegateTypeToExamine(Type type) { ... }

然后叫它:

someObj.PassMeADelegateTypeToExamine(MyFunc);

答案 1 :(得分:0)

委托声明是类型声明,就像structclass一样。所以你可以使用

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