我正在努力完成以下事情:
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/