网站建设资讯

NEWS

网站建设资讯

c#中ExpressionVistor的用法

本篇内容介绍了“c#中ExpressionVistor的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

10年积累的成都做网站、网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有宕昌免费网站建设让你可以放心的选择与我们合作。

class MyVistor :ExpressionVisitor
        {
            private string tableName;
            private StringBuilder sbSql = new StringBuilder();
            public string getsbSql() { return sbSql.ToString(); }
            private string ExpressionTypeToSQL(ExpressionType type)
            {
                switch(type)
                {
                    case ExpressionType.Add:
                        return " + ";
                    case ExpressionType.And:
                        return " and ";
                    case ExpressionType.AndAlso:
                        return " and ";
                    case ExpressionType.Assign:
                        return " = ";
                    case ExpressionType.NotEqual:
                        return " != ";
                    case ExpressionType.Equal:
                        return " == ";
                    case ExpressionType.GreaterThan:
                        return " > ";
                    case ExpressionType.GreaterThanOrEqual:
                        return " >= ";
                    case ExpressionType.LessThan:
                        return " < ";
                    case ExpressionType.LessThanOrEqual:
                        return " <= ";
                    case ExpressionType.Multiply:
                        return " * ";
                    case ExpressionType.Or:
                    case ExpressionType.OrElse:
                        return " or ";
                    default:
                        return "";
                }
            }
            public override Expression Visit(Expression node)
            {
                return base.Visit(node);
            }
            protected override Expression VisitBinary(BinaryExpression node)
            {
                base.Visit(node.Left);
                sbSql.Append(ExpressionTypeToSQL(node.NodeType));
                base.Visit(node.Right);
                return node;
            }
            public string GetSqlString()
            {
                return "select * from " + tableName + " where " + sbSql.ToString();
            }
            protected override Expression VisitConstant(ConstantExpression node)
            {
                if(node.Type == typeof(int))
                {
                    sbSql.Append(node.Value);//ConstantExpression.Value是表示常量表达式的值
                }
                else
                {
                    sbSql.Append("'" + node.Value + "'");
                }
                return base.VisitConstant(node);
            }
            protected override Expression VisitParameter(ParameterExpression node)
            {
                if(tableName == null)
                {
                    tableName = "[" + node.Type.Name + "]";
                }
                return base.VisitParameter(node);
            }
            protected override Expression VisitMember(MemberExpression node)
            {
                sbSql.Append("[" + node.Member.Name + "]");
                return base.VisitMember(node);
            }
        }
        class RefClas
        {
            public int id;
            public int age;
            public RefClas(int id, int age)
            {
                this.id = id;
                this.age = age;
            }
        }
 Expression> expressionsql = a => a.id > 5 && a.age < 10;
            MyVistor myvistor = new MyVistor();
            Expression exp = myvistor.Visit(expressionsql);
            Console.WriteLine(myvistor.getsbSql());//[id] > 5 and [age] < 10
            //编译
            var func2 = expressionsql.Compile();
            RefClas cls2 = new RefClas(10,20);
            bool res = func2(cls2);
            Console.WriteLine("func2返回结果:" + res); //func2返回结果:False
            Console.WriteLine(myvistor.GetSqlString());//select * from [RefClas] where [id] > 5 and [age] < 10

“c#中ExpressionVistor的用法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


文章名称:c#中ExpressionVistor的用法
网页链接:http://cdweb.net/article/gioico.html