Esempio n. 1
0
        private IExpressionNode VisitMethodCall(IMethodCallExpressionNode methodCall)
        {
            _isMulti = true;
            if (methodCall.Target != null)
            {
                return(methodCall);
            }
            BindingMemberExpressionNode member = GetOrAddBindingMember(string.Empty, (s, i) => new BindingMemberExpressionNode(string.Empty, s, i));

            return(new MethodCallExpressionNode(member, methodCall.Method, methodCall.Arguments, methodCall.TypeArgs).Accept(this));
        }
Esempio n. 2
0
        private Expression BuildMethodCall(IMethodCallExpressionNode methodCall)
        {
            if (methodCall.Target == null)
            {
                throw BindingExceptionManager.UnexpectedExpressionNode(methodCall);
            }

            var typeArgs  = GetTypes(methodCall.TypeArgs);
            var hasLambda = methodCall.Arguments
                            .OfType <ILambdaExpressionNode>()
                            .Any();

            if (methodCall.Target.NodeType == ExpressionNodeType.DynamicMember)
            {
                if (hasLambda)
                {
                    throw BindingExceptionManager.UnexpectedExpressionNode(methodCall);
                }
                var parameters = methodCall.Arguments
                                 .Select(node => ExpressionReflectionManager.ConvertIfNeed(BuildExpression(node), typeof(object), false));
                var  arrayArg      = Expression.NewArrayInit(typeof(object), parameters);
                Type returnType    = typeof(object);
                var  dynamicMethod = BindingServiceProvider
                                     .ResourceResolver
                                     .ResolveMethod(methodCall.Method, _dataContext, false);
                if (dynamicMethod != null)
                {
                    returnType = dynamicMethod.GetReturnType(arrayArg.Expressions.ToArrayEx(expression => expression.Type), typeArgs, DataContext);
                }

                return(ExpressionReflectionManager.ConvertIfNeed(Expression.Call(_thisExpression, ProxyMethod, Expression.Constant(methodCall.Method),
                                                                                 DataContextParameter, Expression.Constant(typeArgs, typeof(IList <Type>)), arrayArg), returnType, false));
            }

            var target     = BuildExpression(methodCall.Target);
            var type       = GetTargetType(ref target);
            var targetData = new ArgumentData(methodCall.Target, target, type);
            var args       = methodCall
                             .Arguments
                             .ToArrayEx(node => new ArgumentData(node, node.NodeType == ExpressionNodeType.Lambda ? null : BuildExpression(node), null));

            var method = targetData
                         .FindMethod(methodCall.Method, typeArgs, args, BindingServiceProvider.ResourceResolver.GetKnownTypes(), target == null);

            return(GenerateMethodCall(method, targetData, args));
        }
Esempio n. 3
0
        private Expression BuildMethodCall(IMethodCallExpressionNode methodCall)
        {
            if (methodCall.Target == null)
            {
                throw BindingExceptionManager.UnexpectedExpressionNode(methodCall);
            }

            var typeArgs  = GetTypes(methodCall.TypeArgs);
            var hasLambda = methodCall.Arguments
                            .OfType <ILambdaExpressionNode>()
                            .Any();

            if (methodCall.Target.NodeType == ExpressionNodeType.DynamicMember)
            {
                if (hasLambda)
                {
                    throw BindingExceptionManager.UnexpectedExpressionNode(methodCall);
                }
                var parameters = methodCall.Arguments
                                 .Select(node => ExpressionReflectionManager.ConvertIfNeed(BuildExpression(node), typeof(object), false));
                var  arrayArg      = Expression.NewArrayInit(typeof(object), parameters);
                Type returnType    = typeof(object);
                var  dynamicMethod = BindingServiceProvider
                                     .ResourceResolver
                                     .ResolveMethod(methodCall.Method, _dataContext, false);
                if (dynamicMethod != null)
                {
                    returnType = dynamicMethod.GetReturnType(arrayArg.Expressions.ToArrayEx(expression => expression.Type), typeArgs, _dataContext);
                }

                return(ExpressionReflectionManager.ConvertIfNeed(Expression.Call(_thisExpression, ProxyMethod, Expression.Constant(methodCall.Method),
                                                                                 DataContextParameter, Expression.Constant(typeArgs, typeof(IList <Type>)), arrayArg), returnType, false));
            }

            var target     = BuildExpression(methodCall.Target);
            var type       = GetTargetType(ref target);
            var targetData = new ArgumentData(methodCall.Target, target, type, target == null);
            var args       = methodCall
                             .Arguments
                             .ToArrayEx(node => new ArgumentData(node, node.NodeType == ExpressionNodeType.Lambda ? null : BuildExpression(node), null, false));

            var types = new List <Type>(BindingServiceProvider.ResourceResolver.GetKnownTypes())
            {
                typeof(BindingReflectionExtensions)
            };
            var methods = targetData.FindMethod(methodCall.Method, typeArgs, args, types, target == null);
            var exp     = TryGenerateMethodCall(methods, targetData, args);

            if (exp != null)
            {
                return(exp);
            }
            var arrayArgs = new Expression[args.Length];

            for (int i = 0; i < args.Length; i++)
            {
                var data = args[i];
                if (data.IsLambda || data.Expression == null)
                {
                    throw BindingExceptionManager.InvalidBindingMember(type, methodCall.Method);
                }
                arrayArgs[i] = ExpressionReflectionManager.ConvertIfNeed(data.Expression, typeof(object), false);
            }
            if (target == null)
            {
                throw BindingExceptionManager.InvalidBindingMember(type, methodCall.Method);
            }
            return(Expression.Call(InvokeMemberDynamicMethod,
                                   ExpressionReflectionManager.ConvertIfNeed(target, typeof(object), false),
                                   Expression.Constant(methodCall.Method),
                                   Expression.NewArrayInit(typeof(object), arrayArgs), Expression.Constant(typeArgs),
                                   Expression.Constant(new MethodInvoker()), DataContextParameter));
        }
 private IExpressionNode VisitMethodCall(IMethodCallExpressionNode methodCall)
 {
     _isMulti = true;
     if (methodCall.Target != null)
         return methodCall;
     BindingMemberExpressionNode member = GetOrAddBindingMember(string.Empty, (s, i) => new BindingMemberExpressionNode(string.Empty, s, i));
     return new MethodCallExpressionNode(member, methodCall.Method, methodCall.Arguments, methodCall.TypeArgs).Accept(this);
 }