c# - 带有 params 关键字的委托(delegate)会匹配任何方法吗?

标签 c# delegates

我正在努力完成以下事情:

public delegate void SomeMethod(params object[] parameters);

那是我的委托(delegate)。 我有一些方法可以运行这个 SomeMethod 委托(delegate)(无论传递什么)并返回执行时间跨度。

   public TimeSpan BenchmarkMethod(SomeMethod someMethod, params object[] parameters)
    {
        DateTime benchmarkStart = DateTime.Now;

        someMethod(parameters);

        DateTime benchmarkFinish = DateTime.Now;
        return benchmarkFinish - benchmarkStart;
    }

我还有一些方法:

public abstract void InsertObjects (Company c);

所以,我声明:

SomeMethod dlg = new SomeMethod(InsertObjects);
TimeSpan executionTime = BenchmarkMethod(dlg, c);

但它没有运行,表示“InsertObjects”的无重载匹配委托(delegate)“TestFactory.MeasuringFactory.SomeMethod”。有什么办法吗?..或者我应该更改我的所有方法以接受 params object[] 作为参数?..

最佳答案

严格不可以,方法签名必须与委托(delegate)指定的签名完全匹配(协变匹配除外)。但是,您可以创建一个 object[] 数组并提供给 Delegate.DynamicInvoke(object[] args)

编辑:

如果您有关于要调用的方法的信息,您可以使用 MethodBase.GetParameters().Length 来获取参数的数量,这样您就可以正确地确定无类型参数数组的大小。

不过,对于基准测试,我认为您最好使用实现必要基准测试操作的抽象基类:

abstract class Benchmark
{
    TimeSpan Run()
    {
        Stopwatch swatch = Stopwatch.StartNew();
        // Optionally loop this several times and divide elapsed time by loops:
        RunMethod();
        swatch.Stop();
        return swatch.Elapsed;
    }

    ///<summary>Override this method with the code to be benchmarked.</summary>
    protected abstract void RunMethod()
    {
    }
}

虚拟方法分派(dispatch)的延迟与委托(delegate)相当,比动态调用要好得多。

关于c# - 带有 params 关键字的委托(delegate)会匹配任何方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1353603/

相关文章:

c# - 在 WPF ListView 中显示图像

c# - 如何使用 C# 验证 PowerShell 脚本是否正在运行

c# - 无法声明 ArrayList

c# - 当理论上不可能到达分支时抛出什么异常?

c# - 绑定(bind) WindowsFormsHost 子属性

delegates - QML-自定义PageIndicator以为其指示的每个页面显示图像

ios - 哪个更好 - 依赖委托(delegate)还是通过对象持久化 - iOS

c# - 多个委托(delegate),附加和一个失败

ios - 如何将另一个 ViewController 设置为 AlertView 的委托(delegate)

c# - 在后端类中使用 MethodInvoker