代码之家  ›  专栏  ›  技术社区  ›  Spooks

InvokeMember非常慢,为了避免这种情况?

  •  1
  • Spooks  · 技术社区  · 14 年前

    我想试试看。

    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);
        }
    }
    
    3 回复  |  直到 14 年前
        1
  •  3
  •   AlexC    12 年前

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

    一旦 . 然后缓存并重用结果 委托(与预期的调用签名匹配)。然后使用类型化委托调用。

    注意,非类型化委托调用速度很慢;它必须是类型化的。另外,您可以偷偷摸摸地使用带有额外(前导)参数的委托来调用 方法,如果每次调用都需要更改目标对象。

    对于更复杂的场景,表达式或DynamicMethod非常有用。

        3
  •  1
  •   Jeff    14 年前

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

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