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