C# Expression表达式目录树

本文介绍了C#中的Expression表达式树,这是一种以树形结构表示代码的技术。通过lambda表达式可以创建简单的Expression,编译器在生成IL时会帮助拼装表达式树。此外,还探讨了手动拼装表达式目录树的方法及其在数据库实体到业务实体转换中的应用,以减少代码量并提高效率。
摘要由CSDN通过智能技术生成

Expression就是表达式目录树,是以树形数据结构表示代码,其中每一个节点都是一种表达式。

用lambda表达式来创建一个简单的Expression

使用lambda表达式,编译器在生成IL时会帮我们拼装表达式目录树,示例:

Expression<Func<int, int, int>> expr = (a, b) => a * b + 3;

调试查看表达式的结构:

由图片可以看出,表达式目录树它是以优先级最低那个运算符为根节点,然后再分左右节点,这样子记录数据的。可以用一个二叉树的结构来表示一下:

手动拼装表达式目录树
ParameterExpression Left_a = Expression.Parameter(typeof(int), "a");//Left: ExpressionParameter
ParameterExpression Right_b = Expression.Parameter(typeof(int), "b");//Right: ExpressionParameter
var Right_3 = Expression.Constant(3);//Right:ExpressionConstant
var L
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 中的表达式目录(Expression Tree)是一个抽象语法(AST),可以表示一个 C# 表达式的结构和含义。它们提供了一种将代码表示为数据的方式,可以用于编写动态查询、ORM 映射、编译器、代码生成器等工具。 表达式目录是由 Expression 类型的对象组成的,每个对象都代表了一个 C# 表达式的一部分。例如,一个二元运算符表达式可以表示为一个 BinaryExpression 类型的对象,它包含了左右操作数和运算符等信息。 表达式目录可以通过编写 Lambda 表达式来创建。Lambda 表达式是一种匿名函数,可以将其编译成表达式目录。例如,以下代码创建了一个表示加法的表达式目录: ``` Expression<Func<int, int, int>> addExpr = (x, y) => x + y; ``` 这个表达式目录表示了一个接受两个 int 类型参数并返回 int 类型结果的函数,函数体是 x + y。 表达式目录也可以用于动态构建 LINQ 查询。例如,以下代码构建了一个查询,查询所有 age 大于 18 的人: ``` var people = new List<Person> { ... }; var paramExpr = Expression.Parameter(typeof(Person), "p"); var agePropExpr = Expression.Property(paramExpr, "Age"); var ageConstExpr = Expression.Constant(18, typeof(int)); var greaterThanExpr = Expression.GreaterThan(agePropExpr, ageConstExpr); var lambdaExpr = Expression.Lambda<Func<Person, bool>>(greaterThanExpr, paramExpr); var query = people.AsQueryable().Where(lambdaExpr); ``` 这个代码通过表达式目录构建了一个 Lambda 表达式,查询所有 age 大于 18 的人。其中,Expression.Parameter() 方法创建了一个表示 Person 类型的参数,Expression.Property() 方法创建了一个表示 Age 属性的表达式Expression.Constant() 方法创建了一个表示常量值的表达式Expression.GreaterThan() 方法创建了一个表示大于运算的表达式Expression.Lambda() 方法将这些表达式组合成一个 Lambda 表达式表达式目录可以在编译时或运行时进行解析和执行。例如,以下代码编译并执行了一个表示加法的表达式目录: ``` var addExpr = Expression.Add(Expression.Constant(1), Expression.Constant(2)); var addFunc = Expression.Lambda<Func<int>>(addExpr).Compile(); var result = addFunc(); // 3 ``` 这个代码创建了一个表示加法的表达式目录,然后将其编译成一个函数(addFunc),最后执行这个函数得到结果(result)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值