如何编写一个C#方法来接受未知类型的注入依赖?

时间:2012-10-11 17:06:44

标签: c# .net .net-4.0

背景

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

我正在使用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”能够注入各种返回各种类型的函数呢?我该怎么做?

3 个答案:

答案 0 :(得分: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>,不是吗?

答案 1 :(得分:6)

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

public static void PerformanceTest(Action func, int iterations)

结束而不是通话:

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

这可能会增加时间,因为lambda表达,但我不能说这是如何或如果这甚至是重要的,

答案 2 :(得分: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);
}