C#任何函数作为参数

时间:2013-08-20 14:57:52

标签: c#

是否可以创建一个方法,将任何方法(不管它的参数)作为参数?该方法还有一个params参数,然后获取参数方法的所有参数。

基本上我想要的是这样的东西:

public void CallTheMethod(Action<int> theMethod, params object[] parameters)

但是对于任何方法,不仅仅是对于采用int的方法。

这样的事情可能吗?

由于

3 个答案:

答案 0 :(得分:6)

是的,有代表:

public object CallTheMethod(Delegate theMethod, params object[] parameters)
{
    return theMethod.DynamicInvoke(parameters);
}

但请参阅Marc Gravell's comment您的问题:)

  

嗯,您可以传递非特定Delegate,但DynamicInvoke sloooooowwwwww (相对而言)

答案 1 :(得分:6)

这是可能的,但不应该做什么。

这就是我要做的事情:

public void CallTheMethod(Action toCall)

你可能会“嗯”。基本上,它让用户做的是:

CallTheMethod(() => SomeOtherMethod(with, some, other, parameters));

但是,如果您希望它返回一个类型,则涉及泛型:

public void CallTheMethod<T>(Func<T> theMethod)

您可以在该类型上放置通用约束,随意使用它等等。

答案 2 :(得分:3)

是。您可以使用DynamicInvoke调用方法:

Action<int> method1 = i => { };
Func<bool, string> method2 = b => "Hello";

int arg1 = 3;
bool arg2 = true;
//return type is void, so result = null;
object result = method1.DynamicInvoke(arg1);

//result now becomes "Hello";
result = method2.DynamicInvoke(arg2);

执行此操作的方法将变为:

object InvokeMyMethod(Delegate method, params object[] args)
{
    return method.DynamicInvoke(args);
}