我有一个名为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)
,这显然不起作用。
[更新] 我现在暂时打开这个问题,看看是否有人为这类问题提出解决方法。
答案 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'工作,T
和U
应该实现一些明确定义的接口或从一个基类继承(否则你将做很多反思) ,这有点违背了使用泛型的目的)。因此,请考虑:
Action<int> CheckDuration<T>(Action<T> action, params T[] args)
where T : ISupportCheckDuration
你可以在那里填充任何与ISupportCheckDuration
兼容的内容。
答案 3 :(得分:0)
看看PostSharp:
我认为它可以帮到你。查看跟踪示例。我认为你可以调整它来执行你的时间安排。然后,您可以将属性添加到您需要计时的任何方法,无论它采用多少参数。
克里斯
答案 4 :(得分:0)
不能使用泛型,但使用C ++ / CLI的可变参数模板(当它获得支持时),你可以做到。