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

Mat*_*att 7 .net c# .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);
}
Run Code Online (Sandbox Code Playgroud)

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

Utilities.PerformanceTest(someObject.SomeCustomExtensionMethod(),1000000);
Run Code Online (Sandbox Code Playgroud)

期望"PerformanceTest"方法传递(注入)已知类型的函数.但是,如果我希望"PerformanceTest"能够注入各种返回各种类型的函数呢?我怎么做?

aba*_*hev 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);
}
Run Code Online (Sandbox Code Playgroud)

另外如果你不关心什么类型的论点,你可以通过Func<object>,不是吗?


Ond*_*dra 6

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

public static void PerformanceTest(Action func, int iterations)
Run Code Online (Sandbox Code Playgroud)

结束比打电话:

Utilities.PerformanceTest(() => someObject.SomeCustomExtensionMethod(),1000000);
Run Code Online (Sandbox Code Playgroud)

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