目前我使用DynamicInvoke
,但速度非常慢。仍然使用Delegate
类型,如何在不进行晚期绑定/使用DynamicInvoke
的情况下直接调用Delegate
?
Delegate _method;
_method.DynamicInvoke(_args);
谢谢。
Delegate
添加了一个名为FastDynamicInvoke
的扩展方法,它使用DLR而不是反射,运行速度比DynamicInvoke
快20倍左右。using ImpromptuInterface
...
_method.FastDynamicInvoke(_args);
((dynamic)_method)(_args)
吗? - configurator_method
的签名接受一个数组。 - jbtuleInvoke
速度更快,但有点“隐藏”。来自Delegate类的MSDN
公共语言运行时为每个委托类型提供了一个Invoke方法,其签名与委托相同。您不必从C#、Visual Basic或Visual C++中显式调用此方法,因为编译器会自动调用它。 在反射中使用Invoke方法是很有用的,当您想要找到委托类型的签名时。
这意味着当您创建委托类型时,编译器会自动添加正确签名的Invoke
成员。这允许直接调用而无需经过DynamicInvoke
。
在c#中,您可以像这样使用:
_method(_args);
//or
_method(typedArg1, typedArg2, andSoOn);
像调用普通方法一样调用它。这实际上调用了Invoke
,对您来说应该更快。
System.Delegate
作为委托类型,则不会生成任何 Invoke
方法。如果您可以创建特定的委托,则将看到巨大的速度提升。然而,仅使用 Delegate
是不可能的 - 每次调用都将是动态的。如果您确实需要走这条路,我建议查看 c# 4 和 dynamic
类型,因为 DLR 有一些速度提升。 - Philip Rieck
Delegate
强制转换为一个已声明的委托类型,前提是你预先知道参数和返回值类型。这通过在类型化的委托上使用Invoke
方法来创建接近本地性能(在我的系统上比直接调用慢 5-10%)。 - Abel