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)
我假设 15s 是在循环中使用时;反射没那么慢。
您可以通过获取 MethodInfo 并使用 Delegate.CreateDelegate Once来加速反射(尤其是调用)。然后,您可以缓存并重新使用生成的类型化委托(与预期的调用签名匹配)。然后使用类型化委托 Invoke。
请注意,无类型委托调用速度很慢;必须键入它。还; 如果您需要目标对象在每次调用时进行更改,您可以偷偷摸摸地使用带有额外(前导)参数的委托来针对一系列不同对象调用实例方法。
对于更复杂的场景,Expression 或 DynamicMethod 很有用。
看一看Fasterflect - 一个快速简单的反射 API和快速调用程序,他们已经准备好使用解决方案并且研究起来很有趣。
如果您想按照自己的方式查看文章:Dodge Common Performance Pitfalls to Craft Speedy Applications and Dynamically Compiled Lambdas vs. Pure Reflection
| 归档时间: |
|
| 查看次数: |
3043 次 |
| 最近记录: |