在C#中调用任何函数并返回其返回值(如果有)的通用方法?

时间:2012-08-08 03:16:42

标签: c# generics delegates

我正在尝试一种调用任何类型函数的好方法。无效或返回值,没有参数或许多。我需要计时执行这个功能,并希望从客户端隐藏所有这些。所以我只想给客户端代码一种方法来使用我的类调用任何类型的函数,然后我的类将执行它并计时,然后返回给客户端。

我无法弄清楚的部分是如何支持任何类型的功能。代表需要一种类型。 func需要回报。我想要一些通用的通用,这将使客户端完成设置参数的最小工作量,以及获得返回值的最小工作量(如果有的话)。

这可能没有反思吗?表现在这里非常重要。

我可以想象客户端代码看起来像这样:

Recorder r = new Recorder();
r.Params.Add(param);
r.Params.Add(param);

r.CallFunc([function]);

MyReturnType ret = (MyReturnType)r.returnValue;

这看起来可行吗?

3 个答案:

答案 0 :(得分:4)

这是一种广泛使用的方法来调用方法调用:

public static class Recorder
{
  // overload for any method, that returns value
  public static T CallFunc(Func<T> func)
  {
    // other stuff here
    return func();
    // other stuff here
  }

  // overload for any method, that returns void
  public static CallFunc(Action action)
  {
    // other stuff here
    action();
    // other stuff here
  }
}

用法:

Recorder.CallFunc(() => someObj.SomeMethod(param1, param2));

答案 1 :(得分:0)

你可能只是重载你的方法。

void MyMetaFunction(Action action);
void MyMetaFunction<T>(Action<T> action, T arg);
TResult MyMetaFunction<TResult>(Func<TResult> func);
TResult MyMetaFunction<TResult,TArg>(Func<TResult,TArg> func, TArg arg);

等等。当然,这确实会限制你可以支持的参数数量,但也许这对你来说还是可以的。

答案 2 :(得分:0)

根据您的期望和伪代码,您可以执行以下操作。

public void SomeMethod(params object[] objects) {
}

public void SomeMethod(out object returnValue, params object[] objects) {
}

它支持任何数字和任何类型的参数,并且可以返回值或不返回值,具体取决于客户端选择的重载。但我不得不说,这个似乎就像一个非常糟糕的主意,你将负责处理作为参数传递的任何