InvokeMember 很慢,无论如何要避免这种情况?

Spo*_*oks 2 c# reflection performance late-binding winforms

我必须进行反思和后期绑定,所以我不知道是否有办法加快速度。以为我会试一试。

这个片段大约需要 15 秒才能完成,这太慢了,但看看我需要如何读取元数据。

private static object InvokeCall(Type HostObjectType, Object HostObject, CallType callType, string PropertyOrMethodName, object[] args)
{
    if (callType == CallType.Method)
    {
        return MyObjectType.InvokeMember(PropertyOrMethodName,System.Reflection.BindingFlags.InvokeMethod, null, myObject, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

我假设 15s 是在循环中使用时;反射没那么慢。

您可以通过获取 MethodInfo 并使用 Delegate.CreateDelegate Once来加速反射(尤其是调用)。然后,您可以缓存并重新使用生成的类型化委托(与预期的调用签名匹配)。然后使用类型化委托 Invoke。

请注意,无类型委托调用速度很慢;必须键入它。还; 如果您需要目标对象在每次调用时进行更改,您可以偷偷摸摸地使用带有额外(前导)参数的委托来针对一系列不同对象调用实例方法。

对于更复杂的场景,Expression 或 DynamicMethod 很有用。


Nic*_*nko 5

看一看Fasterflect - 一个快速简单的反射 API快速调用程序,他们已经准备好使用解决方案并且研究起来很有趣。

如果您想按照自己的方式查看文章:Dodge Common Performance Pitfalls to Craft Speedy Applications and Dynamically Compiled Lambdas vs. Pure Reflection