你能声明一个可变长度的泛型类型声明吗?

时间:2009-04-28 15:02:20

标签: c# .net generics overloading

我有一个名为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)

,这显然不起作用。

[更新] 我现在暂时打开这个问题,看看是否有人为这类问题提出解决方法。

5 个答案:

答案 0 :(得分:5)

不幸的是,你已经拥有的是干净利落的。 C#不支持将params用于泛型类型参数,并且支持类似的东西将非常困难。您的原始解决方案很好,并且符合BCL中类似委托的精神,例如Action委托,它们重载定义以获取不同数量的参数。

答案 1 :(得分:3)

你不能像你想要的那样做,但你可以达到同样的目标:

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"));

依此类推。

答案 2 :(得分:0)

不,没有办法。但是,我认为为了使'CheckDuration'工作,TU应该实现一些明确定义的接口或从一个基类继承(否则你将做很多反思) ,这有点违背了使用泛型的目的)。因此,请考虑:

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

你可以在那里填充任何与ISupportCheckDuration兼容的内容。

答案 3 :(得分:0)

看看PostSharp:

http://www.postsharp.org/

我认为它可以帮到你。查看跟踪示例。我认为你可以调整它来执行你的时间安排。然后,您可以将属性添加到您需要计时的任何方法,无论它采用多少参数。

克里斯

答案 4 :(得分:0)

不能使用泛型,但使用C ++ / CLI的可变参数模板(当它获得支持时),你可以做到。