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

这个片段大约需要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);
    }
}
有帮助吗?

解决方案

我认为15s是在循环中使用的;反思不是 减缓。

您可以通过获得MethodInfo并使用delegate.createdelegate加快反思(并特别调用)加快反思(并特别调用)加快速度 一次. 。然后,您缓存并重新使用结果 打字 委托(与预期的呼叫签名匹配)。然后使用键入的代表调用。

注意未经类似的委托调用很慢;必须键入。还;您可以偷偷摸摸,并使用带有额外(领先)参数的代表来调用 实例 如果您需要目标对象来更改每句话,则针对一系列不同对象的方法。

对于更复杂的场景,表达或动态方法很有用。

其他提示

look 更快 - 快速而简单的反射API快速调用 他们准备使用解决方案并有趣的研究。

如果您想以自己的方式走,请检查文章: 道奇共同的性能陷阱用于制作快速应用动态编译的Lambdas与纯反射

尝试使用表达树编译的lambda并缓存lambda。我已经取得了巨大的成功利用这一点。

http://kohari.org/2009/03/06/fast-late-bound-invocation-with-expression-trees//

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top