如何将任意方法(或委托)作为参数传递给函数?
我需要能够通过任意方法的一些功能myFunction
:如何将任意方法(或委托)作为参数传递给函数?
void myFunction(AnyFunc func) { ... }
应该可以与其他静态的,例如,公共或私有方法,甚至委托执行它:
myFunction(SomeClass.PublicStaticMethod);
myFunction(SomeObject.PrivateInstanceMethod);
myFunction(delegate(int x) { return 5*x; });
通过的方法可能有任何数量的参数和任何返回类型。还应该可以通过反射来了解myFunction
中的实际参数数量及其类型。 myFunction
定义中的AnyFunc
将如何适应这些要求?可以接受myFunction
的几个重载版本。
的Delegate
类型是所有其他委托类型的超类型:
void myFunction(Delegate func) { ... }
然后,func.Method
会给你一个MethodInfo
可用于检查返回类型和参数类型的对象。
当调用函数你必须明确地指定要创建哪些类型的委托:
myFunction((Func<int, int>) delegate (int x) { return 5 * x; });
的你想在更高层次上实现将是一件好事什么了,因为这方法可能并不理想。
我想尽可能简化调用网站,并隐藏图书馆内的细节。任何方式来指定'myFunction',以便用户不需要转换他们的委托? – 2013-04-10 16:28:01
@SergiyByelozyorov调用站点不能做得更简单,因为编译器需要* some *具体的委托类型来创建一个实例。如果你想接受“任何委托类型”,那么调用者*必须*自己指定一个委托类型。(例如,给定匿名委托'delegate(){}',['Action'](http://msdn.microsoft.com/en-us/library/system.action.aspx)和['ThreadStart' ](http://msdn.microsoft.com/en-us/library/system.threading.threadstart.aspx)兼容委托类型 - 编译器如何知道要创建哪个?) – cdhowie 2013-04-10 16:29:32
谢谢。我想那是我的答案。这是不可能的。谢谢。 – 2013-04-10 16:32:17
有方法接受一个Delegate
,而不是特定的委托:
void myFunction(Delegate func)
{
}
就像在cdhowie的回答中一样,它需要将委托转换为特定的委托类型或Func <...>。我想避免这种情况。 – 2013-04-10 16:29:00
@SergiyByelozyorov正如他告诉你的,这是不可能的。 – Servy 2013-04-10 16:31:24
如果它有参数,您希望传递给该方法的内容是什么?这听起来像你应该将任何方法转换为无参数/无效返回(又名'Action'),然后再传递给此方法。 – Servy 2013-04-10 16:25:02
'myFunction'将分析该函数的参数,根据某个外部数据库检查它们,并用必要的值调用它,否则将失败,如果没有找到数据库中的匹配条目。 – 2013-04-10 16:26:40
这是一个*非常*令人担忧的设计,其中你基本上把代码当作数据来对待。你应该考虑重新设计这样的代码是静态的。 – Servy 2013-04-10 16:27:32