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

不幸的是,你已经拥有的东西和它所得到的一样干净。C# 不支持使用params泛型类型参数,支持类似的东西会非常困难。您的原始解决方案很好,并且本着 BCL 中类似委托的精神,例如Action具有重载定义以采用不同数量的参数的委托。

于 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实现一些定义良好的接口或从一个基类继承(否则你会做很多反射,这有点违背了使用泛型的目的) . 因此,考虑:

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 回答