.NET 中的表达式树
.NET 中的表达式树(Expression Trees)
表达式树是什么?
表达式树(Expression Trees)是.NET框架中的一个强大功能,它将代码表示为一个由表达式节点组成的树形结构。每个节点代表代码中的一个操作,例如方法调用、算术运算、逻辑运算等。表达式树允许开发者在运行时分析、修改和执行代码。
具体应用场景
- 动态查询:在LINQ to Entities中,表达式树用于将LINQ查询转换为SQL语句,以便在数据库中执行。
- 动态编译:使用
System.Linq.Expressions命名空间中的API,可以动态地构建和编译代码。 - 规则引擎:在某些应用程序中,表达式树可以用于实现复杂的业务规则。
- 代码生成:动态生成代码,以适应不断变化的业务需求。
常用的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 中的表达式树的更多相关文章
- C#中的表达式树简介
表达式树是.NET 3.5之后引入的,它是一个强大灵活的工具(比如用在LINQ中构造动态查询). 先来看看Expression类的API接口: using System.Collections.Obj ...
- C#中的表达式树的浅解
表达式树可以说是Linq的核心之一,为什么是Linq的核心之一呢?因为表达式树使得c#不再是仅仅能编译成IL,我们可以通过c#生成一个表达式树,将结果作为一个中间格式,在将其转换成目标平台上的本机语言 ...
- ASP.NET Core中使用表达式树创建URL
当我们在ASP.NET Core中生成一个action的url会这样写: var url=_urlHelper.Action("Index", "Home"); ...
- C#中的Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- Expression表达式树
表达式树表示树状数据结构的代码,树状结构中的每个节点都是一个表达式,例如一个方法调用或类似 x < y 的二元运算 1.利用 Lambda 表达式创建表达式树 Expression<Fun ...
- 说说lambda表达式与表达式树(未完)
Lambda表达式可以转换成为代码(委托)或者数据(表达式树).若将其赋值给委托,则Lambda表达式将转换为IL代码:如果赋值给 Expression<TDelegate>,则构造出一颗 ...
- Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- C#学习笔记(九):LINQ和表达式树
LINQ LINQ:语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同 ...
- 转载:C#特性-表达式树
原文地址:http://www.cnblogs.com/tianfan/ 表达式树基础 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通 ...
- asp.net core 排序过滤分页组件:sieve(2)表达式树的复习
在Sieve组件中使用了很多关于表达式树的知识,但在我们日常的工作中写表达式树的机会是非常少的,至少在我的编程生涯中没怎么写过表达式树(可能也就是3,4次).所以,为了能够看懂Sieve里面的源代码, ...
随机推荐
- SQL 中的 MIN 和 MAX 以及常见函数详解及示例演示
SQL MIN() 和 MAX() 函数 SQL中的MIN()函数和MAX()函数用于查找所选列的最小值和最大值,分别.以下是它们的用法和示例: MIN() 函数 MIN()函数返回所选列的最小值. ...
- org.xml.sax.SAXParseException; lineNumber: 11;
org.xml.sax.SAXParseException; lineNumber: 11; 点击clean 然后再启动
- 【未测试】CentOS 6.5快速部署HTTP WEB服务器和FTP服务器
CentOS 6.5快速部署HTTP WEB服务器和FTP服务器 [题记]本文使用CentOS 6.5minimal快速搭建HTTP服务器和仅供授权用户登陆的FTP服务器.意在使用授权FTP用户通过登 ...
- 【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句
问题描述 在为APIM服务配置了诊断日志(Diagnostic Setting),把日志收集在Log A Workspace中,需要验证日志中是否能查看到请求的错误信息. 所以想人为的来制造一些错误. ...
- 在RockyLinux 9.3环境中采用RPM模式部署Oracle 19C
在RockyLinux 9.3环境中采用RPM模式部署Oracle 19C 用途 在开发数据库系统时,可以验证功能是否与Oracle的表现一致,验证正确性和兼容性 限制 虚拟机安装,CPU 2*4 内 ...
- DBJ,DB,CJJ,CECS 标准区别及全套下载教程
DBJ DBJ开头的标准是地方建筑标准:D--地方. B--标准. J--建筑. <中华人民共和国标准化法>将中国标准分为国家标准.行业标准.地方标准(DB).企业标准(Q/)四级.地方标 ...
- NOI 2024省选OIFC模拟21 蒲巴巴 超繁做法
题目描述 一年一度的 PuBaBa 杯开始了! 今年的 PuBaBa 杯总共有 \(n\) 个选手来参加,编号分别为 \(1,2,\cdots,n\),他们的水平按编号依次递增,所以他们过的题目数量单 ...
- 牛客网-SQL专项训练8
①在SQL中用条件表示价格在在30至40之间,应该如何表达(B) 解析:IN 与BETWEEN AND的区分 (数字型) 1.in (xx,xx,xx,...) 通常是不连续的,in(30,40)要 ...
- ADBPG&Greenplum成本优化之磁盘水位管理
简介:本文我们将通过一个实际的磁盘空间优化案例来说明,如何帮助客户做成本优化. 作者 | 玉翮 来源 | 阿里技术公众号 一 背景描述 目前,企业的核心数据一般都以二维表的方式存储在数据库中.在 ...
- OceanBase首次阐述战略:继续坚持自研开放之路 开源300万行核心代码
简介: 在数据库OceanBase3.0峰会上,蚂蚁集团自主研发的分布式数据库OceanBase首次从技术.商业和生态三个维度对未来发展战略进行了系统性阐述.同时,OceanBase宣布正式开源,并成 ...