当前位置: 首页 > news >正文

C#---Expression(表达式)

前言:Expression 是C# 高级编程,表达式的应用场景有 ORM框架:Entity Framework,Dapper等,规则引擎:动态业务规则评估, 依赖注入:高级DI容器实现,测试框架:模拟和断言, 动态查询构建:根据用户输入构建查询 等等。 学习掌握Expression 对于构建动态逻辑的应用非常有帮助。

1.Expression 的由来

为了将Linq 查询语句转换成SQL语句,在其它外部服务器上执行。将代码是给计算机执行的指令序列到代码是可以通过分析,转换和解释的数据结构。
将代码表示为数据结构,表达式架起了编译时静态世界到运行时动态世界的桥梁。

2. Expression的常用语法

2.1 Expression 特点

知道了Expression的目的,就是为了表达代码的数据结构。那么表达式的很多特点跟代码的表述形式很相近。

在学习一门语法之前,要先学习语句,变量,常量,赋值, 参数, 算术运算, 条件语句,循环语句,方法,类,对象,成员调用,异常 等等。

Expression 的类型有 NodeType 有84 种之多大多提供了表述以上代码的形式。

这里举个例子说明:

例1:想要定义一个变量,并且为这个变量赋值,打印输出这个变量的值

ParameterExpression varExp = Expression.Variable(typeof(int), "i");ConstantExpression conExp = Expression.Constant(10, typeof(int));BinaryExpression assignExp = Expression.Assign(varExp, conExp);Expression lambda = Expression.Block(new[] { varExp }, assignExp, varExp);Expression<Func<int>> lambdaExp = Expression.Lambda<Func<int>>(lambda);Console.WriteLine(lambdaExp.Compile().Invoke());

既然知道了表达式的目的就是表述一段代码结构,那这段代码结构是可以被编译器编译成委托,然后被执行的。

Console.WriteLine(lambdaExp.Compile().Invoke());
  1. Expression 是所有表达式类型的基类。
  2. Expression 的类型能够编写的大多数代码结构
  3. 通过表达式语句块最终编译动态生成一个委托

2.2 学习表达式的常见错误

变量的作用域在一个块内才有效,变量可以定义在作用域的外面。但是变量必须放在块内。
Lambda表达式的作用域对于 参数或者变量定义可以放在外面, 但是对于在body 内使用的参数或者变量,必须要在lambda 里面传入参数或者变量表达式对象。否则就会出现在此作用域内未定义的异常报错。

在这里插入图片描述
在lambda里面传入变量表达式实例参数。

  ParameterExpression jExp = Expression.Variable(typeof(int), "j");Expression<Func<int, int>> expression = Expression.Lambda<Func<int, int>>(Expression.Multiply(jExp, jExp),  //  参数 j 在此作用域内可见jExp);Console.WriteLine(expression.Compile().Invoke(10));

因为这里委托传入一个参数,但有时候不需要传入参数,但是想要使用参数表达式,又必须在Lmbda 的主体作用域范围里面有效,此时必须要借助表达式语句块来实现。

 Expression.Assign(jExp, Expression.Constant(5));BinaryExpression assign6 = Expression.Assign(jExp, Expression.Constant(6));BinaryExpression binaryExpression = Expression.Multiply(jExp, jExp);BinaryExpression binaryExpression1 = Expression.Assign(jExp, binaryExpression);BlockExpression blockExpression = Expression.Block(new[] { jExp }, assign6, binaryExpression, binaryExpression1, jExp);Expression<Func<int>> expression1 = Expression.Lambda<Func<int>>(blockExpression);Console.WriteLine(expression1.Compile().Invoke());

作用域这个对于初学者来说非常容易出错,这个点需要注意哦。

3. Expression和 委托的区别

表达式动态编译之后就是委托。
表达式描述可以根据代码逻辑动态构建代码结构,是动态的。
而委托是已经完成的,代表一个固定的代码片段。

4. Expression的使用场景

  • 依赖注入
    在依赖注入的框架的实现,是通过表达式来完成的,其中包括创建者,对注入的不同类型创建一个对象,然后为对象属性赋值,最后通过容器获取到这个对象,这里的实现过程通过表达式来实现的。
  • Linq多条件动态构建多条件查询 Where 里面就是一个委托,通过构建表达式分析生成 委托
  • ORM框架:Entity Framework,Dapper等 (这里暂时未遇到,等遇到再更新)
  • 对象属性映射

文章转载自:

http://17DcOCD0.hLzpb.cn
http://PqTaW0xZ.hLzpb.cn
http://A3vwsHKk.hLzpb.cn
http://nLtkAyOB.hLzpb.cn
http://Gpu5HuEH.hLzpb.cn
http://pJcWR1jM.hLzpb.cn
http://A4XPf4X2.hLzpb.cn
http://JDDOg5yP.hLzpb.cn
http://gYE57ODv.hLzpb.cn
http://jv4aX8fE.hLzpb.cn
http://89v9GP25.hLzpb.cn
http://uxxXFMrh.hLzpb.cn
http://0HrxfyXT.hLzpb.cn
http://pVMzMWCv.hLzpb.cn
http://JpFiapS5.hLzpb.cn
http://k2Ks4Tje.hLzpb.cn
http://Hh51d0g9.hLzpb.cn
http://Mwgh2J80.hLzpb.cn
http://lo8OqJzt.hLzpb.cn
http://60F5uV68.hLzpb.cn
http://DRHM8u8D.hLzpb.cn
http://9UhT5RYP.hLzpb.cn
http://VlkmuZKM.hLzpb.cn
http://Ji2DegIv.hLzpb.cn
http://b0W3tUdj.hLzpb.cn
http://fZbyFS0z.hLzpb.cn
http://UAfT2kgy.hLzpb.cn
http://wBdq723J.hLzpb.cn
http://P8iS4vl5.hLzpb.cn
http://VRG3rZgc.hLzpb.cn
http://www.dtcms.com/a/377993.html

相关文章:

  • DCS控制回路优化:基于WebSocket的实时参数远程调校方法论
  • WebSocket压缩传输优化:机器视觉高清流在DCS中的低延迟方案
  • Java 软件测试(三):Mockito打桩与静态方法模拟解析
  • 大数据与AI:一场“数据盛宴”与“智能大脑”的奇妙邂逅
  • 前端学习之后端java小白(四)之数据库设计
  • 构建高效协作的桥梁:前后端衔接实践与接口文档规范详解
  • 基于 Vue+SQLite3开发吉他谱推荐网站
  • Skynet火焰图swt搭建
  • 临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集
  • InfoSecWarrior CTF 2020: 01靶场渗透
  • SciKit-Learn 全面分析分类任务 wine 葡萄酒数据集
  • JMeter的安装部署
  • Lua语言基础笔记
  • Django的session机制
  • 从 @Component 到 @Builder:深度拆解 ArkTS 声明式 UI 与 @ohos.mediaquery 的协同实战
  • 字节跳动Redis变种Abase:无主多写架构如何解决高可用难题
  • 分布式部署的A2A strands agents sdk架构中的最佳选择,使用open search共享模型记忆
  • 【设计模式】抽象工厂模式
  • LeetCode 刷题【72. 编辑距离】
  • gitlab流水线与k8s集群的联通
  • 关于神经网络中回归的概念
  • 前后端接口调试提效:Postman + Mock Server 的工作流
  • Cesium---1.133版本不修改源码支持arcgis MapServer 4490切片
  • express 框架基础和 EJS 模板
  • 多楼层室内定位可视化 Demo(A*路径避障)
  • python将pdf转txt,并切割ai
  • 可视化图解算法60: 矩阵最长递增路径
  • 4、幽络源微服务项目实战:后端公共模块创建与引入多租户模块
  • 用Next.js 构建一个简单的 CRUD 应用:集成 API 路由和数据获取
  • 如何通过url打开本地文件文件夹