0

我试图想出一种调用任何类型函数的好方法。void 或返回值,没有参数或很多。我需要定时执行此功能,并希望对客户隐藏所有这些。所以我只想给客户端代码一种使用我的类调用任何类型的函数的方法,然后我的类将执行它并计时,然后返回给客户端。

我不知道的部分是如何支持任何类型的功能。代表需要一个类型。func 需要返回。我想要一些通用的东西,这将使客户做最少的工作来设置参数,并做最少的工作来获得返回值(如果有的话)。

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

我可以想象客户端代码如下所示:

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

r.CallFunc([function]);

MyReturnType ret = (MyReturnType)r.returnValue;

这看起来可行吗?

4

3 回答 3

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));
于 2012-08-08T03:45:07.717 回答
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);

等等。当然,这确实限制了您可以支持的参数数量,但也许这对您来说仍然可以。

于 2012-08-08T03:28:26.747 回答
0

根据你的期望和伪代码,你可以做这样的事情。

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

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

这支持任何数量和任何类型的参数,并且可以根据客户端选择的重载返回值或不返回值。但我不得不说,这似乎是一个非常糟糕的主意,您将负责处理作为参数传入的任何内容。

于 2012-08-08T03:42:17.027 回答