protected override Expression VisitMethodCall(MethodCallExpression node)
 {
     var visitor = new MethodCallExpressionVisitor(Context);
     visitor.Visit(node);
     Token = visitor.Token;
     return node;
 }
            private Token ParseMethodCallExpression(MethodCallExpression methodCallExpression)
            {
                var visitor = new MethodCallExpressionVisitor(Context);

                visitor.Visit(methodCallExpression);
                return(visitor.Token);
            }
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            var visitor = new MethodCallExpressionVisitor(Context);

            visitor.Visit(node);
            Token = visitor.Token;
            return(node);
        }
        protected override Expression VisitUnary(UnaryExpression node)
        {
            var visitor = new MethodCallExpressionVisitor(Context);

            visitor.Visit(node);
            Token = visitor.Token;
            switch (node.NodeType)
            {
            case ExpressionType.Not:
                if (Token.IsBool())
                {
                    Token = Token.Create(!((bool)Token.Object));
                }
                else if (Token.Type == TokenType.Column)
                {
                    Token = Token.Create(new Condition()
                    {
                        CompareType = CompareType.Not,
                        Left        = Token
                    });
                }
                else
                {
                    throw new Exception();
                }



                //if (Result is bool)
                //{
                //    Type = MemberExpressionType.Object;
                //    Result = !((bool)Result);
                //}
                //else if (visitor.Type == MemberExpressionType.Column)
                //{
                //    Type = MemberExpressionType.Column;
                //    var token = (Token)Result;
                //    switch (token.Type)
                //    {
                //        case TokenType.Column:
                //            Result = Token.Create(new Condition()
                //            {
                //                CompareType = CompareType.Not,
                //                Left = token
                //            });
                //            break;
                //        default:
                //            throw new Exception();
                //    }
                //}
                break;

            default:
                throw new Exception();
            }
            return(node);
        }
        protected override Expression VisitUnary(UnaryExpression node)
        {
            var visitor = new MethodCallExpressionVisitor(Context);
            visitor.Visit(node);
            Token = visitor.Token;
            switch (node.NodeType)
            {
                case ExpressionType.Not:
                    if (Token.IsBool())
                    {
                        Token = Token.Create(!((bool)Token.Object));
                    }
                    else if (Token.Type == TokenType.Column)
                    {
                        Token = Token.Create(new Condition()
                        {
                            CompareType = CompareType.Not,
                            Left = Token
                        });
                    }
                    else
                    {
                        throw new Exception();
                    }




                    //if (Result is bool)
                    //{
                    //    Type = MemberExpressionType.Object;
                    //    Result = !((bool)Result);
                    //}
                    //else if (visitor.Type == MemberExpressionType.Column)
                    //{
                    //    Type = MemberExpressionType.Column;
                    //    var token = (Token)Result;
                    //    switch (token.Type)
                    //    {
                    //        case TokenType.Column:
                    //            Result = Token.Create(new Condition()
                    //            {
                    //                CompareType = CompareType.Not,
                    //                Left = token
                    //            });
                    //            break;
                    //        default:
                    //            throw new Exception();
                    //    }
                    //}
                    break;
                default:
                    throw new Exception();
            }
            return node;
        }
 public override System.Linq.Expressions.Expression Visit(System.Linq.Expressions.Expression node)
 {
     ExpressionVisitorBase visitor = null;
     if (node.NodeType == System.Linq.Expressions.ExpressionType.Call)
     {
         visitor = new MethodCallExpressionVisitor(Context);
     }
     else
     {
         visitor = new PropertyFieldExpressionVisitor(Context);
     }
     visitor.Visit(node);
     Token = visitor.Token;
     return node;
 }
Exemple #7
0
        public override System.Linq.Expressions.Expression Visit(System.Linq.Expressions.Expression node)
        {
            ExpressionVisitorBase visitor = null;

            if (node.NodeType == System.Linq.Expressions.ExpressionType.Call)
            {
                visitor = new MethodCallExpressionVisitor(Context);
            }
            else
            {
                visitor = new PropertyFieldExpressionVisitor(Context);
            }
            visitor.Visit(node);
            Token = visitor.Token;
            return(node);
        }
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            MethodCallExpressionVisitor visitor = new MethodCallExpressionVisitor(Context);

            visitor.Visit(node);
            var type = visitor.Token.Type;

            if (type == TokenType.Column)
            {
                Token = visitor.Token;
                var column = Token.Column;
                while (_memberInfos.Count > 0)
                {
                    var exp = _memberInfos.Pop();
                    switch (exp.NodeType)
                    {
                    case ExpressionType.MemberAccess:
                        var memberInfo = ((MemberExpression)exp).Member;
                        column.Converters.Push(new ColumnConverter(memberInfo, new List <object>()));
                        break;

                    default:
                        throw new Exception();
                    }
                }
                //column.Converter = GetConverter(column.Converter);
            }
            else if (type == TokenType.Condition)
            {
                throw new Exception();
            }
            else
            {
                var obj = visitor.Token.Object;
                while (_memberInfos.Count > 0)
                {
                    obj = GetValue((MemberExpression)_memberInfos.Pop(), obj);
                }
                Token = Token.Create(obj);
            }
            return(node);
        }
 protected override Expression VisitMethodCall(MethodCallExpression node)
 {
     MethodCallExpressionVisitor visitor = new MethodCallExpressionVisitor(Context);
     visitor.Visit(node);
     var type = visitor.Token.Type;
     if (type == TokenType.Column)
     {
         Token = visitor.Token;
         var column = Token.Column;
         while (_memberInfos.Count > 0)
         {
             var exp = _memberInfos.Pop();
             switch (exp.NodeType)
             {
                 case ExpressionType.MemberAccess:
                     var memberInfo = ((MemberExpression)exp).Member;
                     column.Converters.Push(new ColumnConverter(memberInfo, new List<object>()));
                     break;
                 default:
                     throw new Exception();
             }
         }
         //column.Converter = GetConverter(column.Converter);
     }
     else if (type == TokenType.Condition)
     {
         throw new Exception();
     }
     else
     {
         var obj = visitor.Token.Object;
         while (_memberInfos.Count > 0)
         {
             obj = GetValue((MemberExpression)_memberInfos.Pop(), obj);
         }
         Token = Token.Create(obj);
     }
     return node;
 }
            Token ParseNotExpression(UnaryExpression unaryExpression)
            {
                var operand = unaryExpression.Operand;

                if (operand is MemberExpression)
                {
                    var visitor = new MemberExpressionVisitor(Context);
                    visitor.Visit(operand);
                    switch (visitor.Token.Type)
                    {
                    case TokenType.Object:
                        if (visitor.Token.IsBool())
                        {
                            return(Token.Create(!((bool)visitor.Token.Object)));
                        }
                        else
                        {
                            throw new Exception("不支持");
                        }

                    case TokenType.Column:
                        if (operand.Type == typeof(bool) || operand.Type == typeof(bool?))
                        {
                            return(Token.Create(new Condition()
                            {
                                CompareType = CompareType.Equal,
                                Left = Token.Create(1),
                                Right = Token.Create(1)
                            }));
                        }
                        return(Token.Create(new Condition()
                        {
                            Left = visitor.Token,
                            CompareType = CompareType.Not
                        }));

                    default:
                        throw new Exception();
                    }
                }
                else if (operand is MethodCallExpression)
                {
                    var visitor = new MethodCallExpressionVisitor(Context);
                    visitor.Visit(operand);
                    var token = visitor.Token;
                    switch (token.Type)
                    {
                    case TokenType.Column:
                        return(Token.Create(new Condition()
                        {
                            Left = token,
                            CompareType = CompareType.Not
                        }));

                    case TokenType.Condition:
                        return(Token.Create(new Condition()
                        {
                            Left = Token.Create(token.Condition),
                            CompareType = CompareType.Not
                        }));

                    case TokenType.Object:
                        return(Token.Create(!((bool)token.Object)));

                    default:
                        throw new Exception();
                    }
                }
                else
                {
                    throw new Exception("不支持");
                }
                throw new Exception();
            }
 Token ParseNotExpression(UnaryExpression unaryExpression)
 {
     var operand = unaryExpression.Operand;
     if (operand is MemberExpression)
     {
         var visitor = new MemberExpressionVisitor(Context);
         visitor.Visit(operand);
         switch (visitor.Token.Type)
         {
             case TokenType.Object:
                 if (visitor.Token.IsBool())
                 {
                     return Token.Create(!((bool)visitor.Token.Object));
                 }
                 else
                 {
                     throw new Exception("不支持");
                 }
             case TokenType.Column:
                 if (operand.Type == typeof(bool) || operand.Type == typeof(bool?))
                 {
                     return Token.Create(new Condition()
                     {
                         CompareType = CompareType.Equal,
                         Left = Token.Create(1),
                         Right = Token.Create(1)
                     });
                 }
                 return Token.Create(new Condition()
                 {
                     Left = visitor.Token,
                     CompareType = CompareType.Not
                 });
             default:
                 throw new Exception();
         }
     }
     else if (operand is MethodCallExpression)
     {
         var visitor = new MethodCallExpressionVisitor(Context);
         visitor.Visit(operand);
         var token = visitor.Token;
         switch (token.Type)
         {
             case TokenType.Column:
                 return Token.Create(new Condition()
                 {
                     Left = token,
                     CompareType = CompareType.Not
                 });
             case TokenType.Condition:
                 return Token.Create(new Condition()
                 {
                     Left = Token.Create(token.Condition),
                     CompareType = CompareType.Not
                 });
             case TokenType.Object:
                 return Token.Create(!((bool)token.Object));
             default:
                 throw new Exception();
         }
     }
     else
     {
         throw new Exception("不支持");
     }
     throw new Exception();
 }
 private Token ParseMethodCallExpression(MethodCallExpression methodCallExpression)
 {
     var visitor = new MethodCallExpressionVisitor(Context);
     visitor.Visit(methodCallExpression);
     return visitor.Token;
 }