表达式树的解析.
2016-08-02 18:37
176 查看
前言
公司的orm框架在dapper的基础上扩展了一套表达式的方法,当时就研究了一下,把学习过程和结果记录下来,和大家分享。有人会说重复造轮子没必要,直接上EF。
从我的角度来看重复造轮子的原因有以下三种:
1、研究造轮子的原理
2、轮子不满足现在的开发需要
3、装B
表达式树的作用
最常用到的无非就是ORM的删查改的条件,ORM就是在ado.Net的基础上封装了一层表达式,最后还是将表达式解析成sql,由ado.Net去执行。那么我们能将表达式树解析成字符串,那么也能反过来。例如运费系统,在后台设置定义好一套计算规则。例如:对应不同的发货渠道,什么重量取哪个区间的费用,多于哪个阶段的费用还要额外费用。我们可以通过解析这套计算规则拼装好表达式树传入参数进行计算。。。
还有别的在评论补充下。。。
不扯多,现在我们只拿解析表达式树来学习。
创建表达式
首先创建4个属性的Users类public class ExpressionTrasfer : ExpressionVisitor { public StringBuilder GeWhere = new StringBuilder(100); public string Where { get { return GeWhere.ToString(); } } public void ResolveExpression(Expression<Func<Users, bool>> expression) { Visit(expression.Body); } protected override Expression VisitBinary(BinaryExpression node) { GeWhere.Append("("); Visit(node.Left); GeWhere.Append(node.NodeType.TransferExpressionType()); Visit(node.Right); GeWhere.Append(")"); return node; } protected override Expression VisitConstant(ConstantExpression node) { if (node.Type == typeof(string)) { GeWhere.Append("'" + node.Value + "'"); } else if (node.Type == typeof(int)) { GeWhere.Append(node.Value); } return node; } protected override Expression VisitMember(MemberExpression node) { GeWhere.Append(node.Member.Name); return node; } }
View Code
结束
一个简单的表达式解析大致完成了,当然里面还有很多可以完善,例如值类型的判断,is 还是 = ,VisitMethodCall重写等等。原理就这样,实现我这里就不一一列举。如对大家有帮助,麻烦请推荐,有不足请在下面评论提出,我会一一更改。相关文章推荐
- canvas.save()和canvas.restore()的区别
- 数据结构实验之栈四:括号匹配
- 理解inode
- git 和 svn的区别
- HDU 3394 Railway(点双连通分量)
- GreenDAO 使用小结
- 编译64位的libjpeg
- UI设计师不可不知的安卓屏幕知识(转载)
- ES6 手册(下)
- ES6 手册(上)
- 服务器硬件知识普及篇(需要配置服务器的朋友可以参考)
- theano学习指南---降噪自编码(源码)
- [LeetCode]--63. Unique Paths II
- hdu 5781 ATM Mechine dp
- Ubuntu 下apache和mysql的开机启动
- 开源流量监控
- 5月随笔
- 【安卓存储SharedPreferences】
- HTTP提交方式POST和PUT的区别
- windows多线程接口介绍和使用