2013-04-10 72 views
7

我需要能够通过任意方法的一些功能myFunction如何将任意方法(或委托)作为参数传递给函数?

void myFunction(AnyFunc func) { ... } 

应该可以与其他静态的,例如,公共或私有方法,甚至委托执行它:

myFunction(SomeClass.PublicStaticMethod); 
myFunction(SomeObject.PrivateInstanceMethod); 
myFunction(delegate(int x) { return 5*x; }); 

通过的方法可能有任何数量的参数和任何返回类型。还应该可以通过反射来了解myFunction中的实际参数数量及其类型。 myFunction定义中的AnyFunc将如何适应这些要求?可以接受myFunction的几个重载版本。

+0

如果它有参数,您希望传递给该方法的内容是什么?这听起来像你应该将任何方法转换为无参数/无效返回(又名'Action'),然后再传递给此方法。 – Servy 2013-04-10 16:25:02

+0

'myFunction'将分析该函数的参数,根据某个外部数据库检查它们,并用必要的值调用它,否则将失败,如果没有找到数据库中的匹配条目。 – 2013-04-10 16:26:40

+0

这是一个*非常*令人担忧的设计,其中你基本上把代码当作数据来对待。你应该考虑重新设计这样的代码是静态的。 – Servy 2013-04-10 16:27:32

回答

6

Delegate类型是所有其他委托类型的超类型:

void myFunction(Delegate func) { ... } 

然后,func.Method会给你一个MethodInfo可用于检查返回类型和参数类型的对象。

当调用函数你必须明确地指定要创建哪些类型的委托:

myFunction((Func<int, int>) delegate (int x) { return 5 * x; }); 

的你想在更高层次上实现将是一件好事什么了,因为这方法可能并不理想。

+0

我想尽可能简化调用网站,并隐藏图书馆内的细节。任何方式来指定'myFunction',以便用户不需要转换他们的委托? – 2013-04-10 16:28:01

+1

@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

+0

谢谢。我想那是我的答案。这是不可能的。谢谢。 – 2013-04-10 16:32:17

0

有方法接受一个Delegate,而不是特定的委托:

void myFunction(Delegate func) 
{ 

} 
+0

就像在cdhowie的回答中一样,它需要将委托转换为特定的委托类型或Func <...>。我想避免这种情况。 – 2013-04-10 16:29:00

+0

@SergiyByelozyorov正如他告诉你的,这是不可能的。 – Servy 2013-04-10 16:31:24

相关问题