.NET 中的表达式树(Expression Trees)

表达式树是什么?

表达式树(Expression Trees)是.NET框架中的一个强大功能,它将代码表示为一个由表达式节点组成的树形结构。每个节点代表代码中的一个操作,例如方法调用、算术运算、逻辑运算等。表达式树允许开发者在运行时分析、修改和执行代码。

具体应用场景

  1. 动态查询:在LINQ to Entities中,表达式树用于将LINQ查询转换为SQL语句,以便在数据库中执行。
  2. 动态编译:使用System.Linq.Expressions命名空间中的API,可以动态地构建和编译代码。
  3. 规则引擎:在某些应用程序中,表达式树可以用于实现复杂的业务规则。
  4. 代码生成:动态生成代码,以适应不断变化的业务需求。

常用的API

  • Expression 类:表示表达式树中的一个节点。
  • ParameterExpression 类:表示表达式树中的参数。
  • LambdaExpression 类:表示一个Lambda表达式,通常用于定义委托。
  • MethodCallExpression 类:表示对方法的调用。
  • BinaryExpression 类:表示二元操作,如算术运算和逻辑运算。
  • UnaryExpression 类:表示一元操作,如递增或递减。
  • ConstantExpression 类:表示一个常量值。
  • Expression<TDelegate> 类:表示一个特定类型的委托表达式。

示例代码

以下是一个简单的使用案例

using System;
using System.Linq.Expressions; class ExpressionTreeDemo
{
static void Main(string[] args)
{
// 创建参数表达式
ParameterExpression param = Expression.Parameter(typeof(int), "x"); // 创建一个表达式:x * 2 + 3
BinaryExpression addExpr = Expression.Add(
Expression.Multiply(param, Expression.Constant(2)),
Expression.Constant(3)
); // 创建Lambda表达式
LambdaExpression lambda = Expression.Lambda(addExpr, param); // 将表达式树编译为委托
Func<int, int> func = (Func<int, int>)lambda.Compile(); // 执行表达式树
int result = func(5);
Console.WriteLine($"Result: {result}"); // 输出结果:13
}
}

表达式树是.NET中一个高级的特性,它为动态代码生成和执行提供了强大的支持。通过表达式树,开发者可以实现高度灵活和动态的代码逻辑。

以下是表达式树相关的类

类(Class) 描述(Description)
ParameterExpression 继承Expression,表示一个命名参数表达式(ps:parameter)
ConstantExpression 继承Expression,表示具有常数值的表达式(ps:object)
BinaryExpression 继承Expression,表示具有二进制运算符的表达式(ps:加减乘除)
MemberExpression 继承Expression,表示访问属性或字段(ps:Expression.Fieldo/PropertyO)
MethodCallExpression 继承Expression,表示对静态方法或实例方法的调用(ps:Expression.Callo)
ConditionalExpression 继承Expression,表示包含条件运算符的表达式。(ps:Expression.ConditionO)
LambdaExpression 继承Expression,描述一个Lambda表达式
ListInitExpression 继承Expression,表示包含集合初始值设定项的构造函数调用
NewExpression 继承Expression,表示构造函数调用
NewArrayExpression 继承Expression,表示创建新数组并可能初始化该新数组的元素
MemberMemberBinding 继承Expression,表示初始化新创建对象的成员的成员
MemberinitExpression 继承Expression,表示调用构造函数并初始化新对象的一个或多个成员
MemberAssignment 继承Expression,表示初始化新创建对象的字段或属性
InvocationExpression 继承Expression,表示将委托或lambda表达式应用于参数表达式列表的表达式
Expression<(Of (TDelegate)>) 以表达式自录树的形式将强类型lambda表达式表示为数据结构。无法继承此类
TypeBinaryExpression 表示表达式和类型之间的操作
UnaryExpression 表示包含一元运算符的表达式

.NET 中的表达式树的更多相关文章

  1. C#中的表达式树简介

    表达式树是.NET 3.5之后引入的,它是一个强大灵活的工具(比如用在LINQ中构造动态查询). 先来看看Expression类的API接口: using System.Collections.Obj ...

  2. C#中的表达式树的浅解

    表达式树可以说是Linq的核心之一,为什么是Linq的核心之一呢?因为表达式树使得c#不再是仅仅能编译成IL,我们可以通过c#生成一个表达式树,将结果作为一个中间格式,在将其转换成目标平台上的本机语言 ...

  3. ASP.NET Core中使用表达式树创建URL

    当我们在ASP.NET Core中生成一个action的url会这样写: var url=_urlHelper.Action("Index", "Home"); ...

  4. C#中的Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  5. Expression表达式树

    表达式树表示树状数据结构的代码,树状结构中的每个节点都是一个表达式,例如一个方法调用或类似 x < y 的二元运算 1.利用 Lambda 表达式创建表达式树 Expression<Fun ...

  6. 说说lambda表达式与表达式树(未完)

    Lambda表达式可以转换成为代码(委托)或者数据(表达式树).若将其赋值给委托,则Lambda表达式将转换为IL代码:如果赋值给 Expression<TDelegate>,则构造出一颗 ...

  7. Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  8. C#学习笔记(九):LINQ和表达式树

    LINQ LINQ:语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同 ...

  9. 转载:C#特性-表达式树

    原文地址:http://www.cnblogs.com/tianfan/ 表达式树基础 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通 ...

  10. asp.net core 排序过滤分页组件:sieve(2)表达式树的复习

    在Sieve组件中使用了很多关于表达式树的知识,但在我们日常的工作中写表达式树的机会是非常少的,至少在我的编程生涯中没怎么写过表达式树(可能也就是3,4次).所以,为了能够看懂Sieve里面的源代码, ...

随机推荐

  1. SpringBoot中bean的生命周期

    目录 概述 使用场景 代码演示bean初始化 TestSupport BeanPostProcessorImpl log 代码 概述 Bean 生命周期管理是 Spring Boot 中的关键功能之一 ...

  2. [一本通1700]PFS集合

    题目描述 有一种特殊的集合叫做PFS(Prefix Free Set)集合. 一个PFS集合由若干字符串构成,且不存在一个字符串是另一个字符串的前缀.空集也被看作是PFS集合. 例如 {\(" ...

  3. C# 面向对象编程进阶:构造函数详解与访问修饰符应用

    C# 构造函数 构造函数是一种特殊的方法,用于初始化对象.构造函数的优势在于,在创建类的对象时调用它.它可以用于为字段设置初始值: 示例 获取您自己的 C# 服务器 创建一个构造函数: // 创建一个 ...

  4. vscode 编辑python 如何格式化

    正文 今天同事说我的代码的格式不对,其实就是几个空格忘了空4格了,但是代码可运行. 那么如何帮我们检测呢? pip install yapf 然后打开setting: 输入:ython.formatt ...

  5. 重新整理数据结构与算法(c#)——算法套马踏棋算法[三十三]

    前言 马踏棋盘 概念在这,不做过多复述. https://baike.sogou.com/v58959803.htm?fromTitle=马踏棋盘 思路是这样子的,一匹马有上面几种做法,然后进行尝试, ...

  6. 鸿蒙HarmonyOS实战-ArkUI组件(Shape)

    一.Shape Shape组件是用于创建2D形状和粒子效果的组件.它可以创建包括圆形.正方形.三角形和多边形等基本形状,同时还可以自定义形状.Shape组件创建各种不同的效果,例如火花.烟雾.雨滴等. ...

  7. 嘉楠k210 kd233官方demo板gpio点灯实验

    使用maixpy  micropython开发 import utime from Maix import GPIO from board import board_info from fpioa_m ...

  8. 测试环境不稳定&复杂的必然性及其对策

    简介: 为什么测试环境的不稳定是必然的,怎么让它尽量稳定一点?为什么测试环境比生产环境更复杂,怎么让它尽量简单一点?本文将就这两点进行分享.同时,还会谈一谈对测试环境和生产环境的区别的理解. 作者 | ...

  9. 更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性

    简介: 在正文开始之前,我们先回顾一下单元化部署的概念和设计理念.在边缘计算场景下,计算节点具有很明显的地域分布属性,相同的应用可能需要部署在不同地域下的计算节点上. 作者 | 张杰(冰羽)来源 |  ...

  10. Quick Audience 营销活动功能一期上线

    ​简介: 营销活动为Quick Audience(QA)用户洞察下的一个功能模块,通过这个模块,可以将QA侧生成的受众以及营销渠道全部关联起来,从营销活动的视角,一站式完成活动目标制定.活动计划制定到 ...