Beispiel #1
0
        private static Func <Closure, object> Call(MethodCallExpression methodCallExpression,
                                                   ConstantExpression[] constantsExprs, ParameterExpression[] localsExprs)
        {
            var targetFn = Expression(methodCallExpression.Object, constantsExprs, localsExprs);
            var argsFns  = methodCallExpression.Arguments.Select(e => Expression(e, constantsExprs, localsExprs)).ToArray();
            var invokeFn = MethodCall.TryCreate(methodCallExpression.Method);

            if (invokeFn != null)
            {
                return(closure => { return invokeFn(closure, argsFns); });
            }
            else
            {
                return(closure =>
                {
                    var target = targetFn(closure);
                    var args = new object[argsFns.Length];
                    for (var i = 0; i < args.Length; i++)
                    {
                        args[i] = argsFns[i](closure);
                    }

                    return methodCallExpression.Method.Invoke(target, args);
                });
            }
        }