7

背景

我有几个实用方法我想添加到我正在使用的解决方案中,并且使用依赖注入将打开所述方法的更多潜在用途。

我正在使用 C#、.NET 4

这是我想要完成的一个例子(这只是一个例子):

public static void PerformanceTest(Func<???> func, int iterations)
{
    var stopWatch = new Stopwatch();
    stopWatch.Start();
    for (int i = 0; i < iterations; i++)
    {
      var x = func();
    }
    stopWatch.Stop();

    Console.WriteLine(stopWatch.ElapsedMilliseconds);
}

我在这里所做的是创建一种方法来测试我的代码的某些元素在调试时的性能。这是一个如何使用它的示例:

Utilities.PerformanceTest(someObject.SomeCustomExtensionMethod(),1000000);

问题

“PerformanceTest”方法期望传递(注入)已知类型的函数。但是,如果我希望“PerformanceTest”允许注入返回各种类型的各种函数呢?我怎么做?

4

3 回答 3

9

它不能只是通用的吗?

public static void PerformanceTest<T>(Func<T> func, int iterations)
{
    var stopWatch = Stopwatch.StartNew();
    for (int i = 0; i < iterations; i++)
    {
        T x = func();
    }
    stopWatch.Stop();

    Console.WriteLine(stopWatch.ElapsedMilliseconds);
}

此外,如果您不关心参数的类型,您可以通过Func<object>,不是吗?

于 2012-10-11T17:08:46.577 回答
6

我会将您的 PerformanceTest 方法更改为:

public static void PerformanceTest(Action func, int iterations)

结束比调用:

Utilities.PerformanceTest(() => someObject.SomeCustomExtensionMethod(),1000000);

由于 lambda 表达式,这可能会增加时间,但我不能说这如何或是否重要,

于 2012-10-11T17:12:48.337 回答
2

使用泛型:

public static void PerformanceTest<T>(Func<T> func, int iterations)
{
    var stopWatch = new Stopwatch();
    stopWatch.Start();
    for (int i = 0; i < iterations; i++)
    {
      var x = func();
    }
    stopWatch.Stop();

    Console.WriteLine(stopWatch.ElapsedMilliseconds);
}
于 2012-10-11T17:10:28.853 回答