您的位置:首页 > 其它

表达式树的解析.

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重写等等。原理就这样,实现我这里就不一一列举。如对大家有帮助,麻烦请推荐,有不足请在下面评论提出,我会一一更改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: