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

あなたの期待と擬似コードに基づいて、あなたはこのようなことをすることができます。

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

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

これは、任意の数と任意のタイプの引数の両方をサポートし、クライアントが選択した過負荷に応じて、値を返す場合と返さない場合があります。しかし、私は言わなければなりません、これは本当に悪い考えのように思えます、そしてあなたは議論として渡されたものすべてを処理する責任があります。

于 2012-08-08T03:42:17.027 に答える
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 に答える