1

CheckDuration次の関数シグネチャで呼び出されるオーバーロードされたユーティリティ メソッドがあります。

    private static Action<int> CheckDuration(Action action)
    private static Action<int> CheckDuration<T>(Action<T> action, T arg)

基本的CheckDurationに、メソッドの実行にかかった時間をコンソールに出力します。

ここで、引数を 2 つ取るメソッドの実行時間を確認したいと思います。
したがってCheckDuration、次のメソッド シグネチャでオーバーロードされた別のものを作成する必要があります。

    private static Action<int> CheckDuration<T, U>(
        Action<T, U> action, T arg1, U arg2)

これをより優雅に処理する方法はありますか?
みたいなことを考えていた

    private static Action<int> CheckDuration<params T>(
      Action<params T> action, params T arg)

、これは明らかに機能しません。

[更新]この種の問題の回避策を誰かが思いついたかどうかを確認するために、この質問を今のところ開いたままにします。

4

5 に答える 5

5

残念ながら、あなたがすでに持っているものは、これから得るのと同じくらいきれいです。paramsC# はジェネリック型パラメーターの使用をサポートしておらず、そのようなものをサポートすることは非常に困難です。元のソリューションは優れており、Action異なる数の引数を取るために定義をオーバーロードしたデリゲートのような BCL の同様のデリゲートの精神にあります。

于 2009-04-28T15:03:25.910 に答える
4

思い通りにはできませんが、同じ目標を達成することはできます。

public static class MethodTimer
{
    public static long Run(Action action)
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();
        action();
        sw.Stop();
        return sw.ElapsedMilliseconds;
    }
}
class Program
{
    static void Main(string[] args)
    {
        long time = MethodTimer.Run(() => File.Open(@"c:\test.txt", 
            FileMode.CreateNew));
        Console.WriteLine(time);
        Console.ReadLine();
    }
}

これを拡張メソッドとして定義することもできるため、コードは次のようになります。

        Action act = () => File.Open(@"c:\test.txt", FileMode.CreateNew);
        time=act.Time();

このメソッドは次のように定義されます。

public static class MethodTimer
    {
        public static long Time(this Action action)
        {
            var sw = System.Diagnostics.Stopwatch.StartNew();
            action();
            sw.Stop();
            return sw.ElapsedMilliseconds;
        }
    }

編集

新しいメソッドを定義する必要はありません。このアプローチでは、時間を計るメソッドの周りにクロージャーを使用しています。そう:

MethodTimer.Time(()=> File.Open("",FileMode.Open);
MethodTimer.Time(()=> myObject.TestMethod(123,1231,"another param"));

などなど。

于 2009-04-28T15:25:22.800 に答える
0

いいえ、仕方がありません。ただし、この「CheckDuration」が機能するためには、T適切Uに定義されたインターフェイスを実装するか、1 つの基本クラスから継承する必要があると思います (そうしないと、多くのリフレクションを行うことになり、ジェネリックを使用する目的が少し損なわれます) . したがって、次のことを考慮してください。

Action<int> CheckDuration<T>(Action<T> action, params T[] args)
    where T : ISupportCheckDuration

ISupportCheckDuration互換性のあるものなら何でも詰め込むことができます。

于 2009-04-28T15:05:41.177 に答える
0

PostSharp をご覧ください。

http://www.postsharp.org/

私はそれがあなたを助けることができると思います. トレースの例を見てください。あなたのタイミングを実行するためにそれを適応させることができると思います。次に、必要な引数の数に関係なく、時間を計る必要がある任意のメソッドに属性を追加するだけです。

クリス

于 2009-04-28T15:24:13.113 に答える
0

ジェネリックでは不可能ですが、C++/CLI の可変個引数テンプレート (サポートされる場合) を使用すると、それを行うことができます。

于 2009-04-28T15:27:45.227 に答える