2

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

这个片段大约需要 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);
    }
}
4

3 回答 3

5

看看Fasterflect - 一个快速简单的反射 APIFast Invoker,它们已经准备好使用解决方案并且学习起来很有趣。

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

于 2010-10-18T18:31:16.623 回答
4

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

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

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

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

于 2010-10-18T18:18:28.450 回答
1

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

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

于 2010-10-18T18:40:24.020 回答