c#动态树形表达式详解

动态树形表达式(Expression Trees)是一种将代码逻辑表示为树状数据结构的技术,广泛应用于 LINQ 查询、动态代码生成和反射替代等场景

15。以下是其核心详解:

  1. 基本概念‌

定义‌:表达式树以树形结构表示代码逻辑,每个节点代表一个操作(如常量、方法调用、属性访问等),根节点为表达式整体

1

5。

特点‌:

不可变性‌:创建后不可修改

9。

延迟执行‌:需编译为委托后执行,支持动态分析

2

6。

  1. 核心组件‌

表达式树由 System.Linq.Expressions 命名空间中的类构成,常见节点类型包括:

ParameterExpression‌:表示参数(如 (x, y) => x + y 中的 x 和 y)

1

6。

ConstantExpression‌:表示常量值(如 5)

2

7。

BinaryExpression‌:表示二元运算(如加法 x + y)

1

14。

MethodCallExpression‌:表示方法调用(如 Console.WriteLine())

6

9。

  1. 创建方式‌

3.1 通过 Lambda 表达式隐式创建‌

csharp

Copy Code

Expression<Func<int, int, int>> addExpr = (a, b) => a + b;

编译器自动将 Lambda 转换为表达式树

5

7。

3.2 通过 API 手动构建‌

csharp

Copy Code

ParameterExpression paramA = Expression.Parameter(typeof(int), "a");

ParameterExpression paramB = Expression.Parameter(typeof(int), "b");

BinaryExpression body = Expression.Add(paramA, paramB);

Expression<Func<int, int, int>> addExpr = Expression.Lambda<Func<int, int, int>>(body, paramA, paramB);

通过 Expression 类静态方法逐层构建

6

14。

  1. 动态应用场景‌

动态 LINQ 查询‌:将表达式树转换为 SQL(如 Entity Framework)

9

15。

代码生成‌:运行时动态生成方法或类

3

8。

反射替代‌:通过表达式树访问成员或调用方法,性能优于传统反射

9

17。

  1. 编译与执行‌

表达式树需编译为委托方可执行:

csharp

Copy Code

Func<int, int, int> addFunc = addExpr.Compile();

int result = addFunc(3, 5); // 输出 8

编译后的委托可直接调用

4

6。

  1. 高级操作‌

修改表达式树‌:通过 ExpressionVisitor 遍历和修改节点

6

14。

动态条件拼接‌:根据运行时条件组合多个表达式(如 Where 条件过滤)

8

17。

  1. 示例:动态生成查询条件‌

csharp

Copy Code

Expression<Func<Book, bool>> filter = b => b.Price > 5;

// 动态扩展条件

if (needAuthorFilter)

filter = Expression.Lambda<Func<Book, bool>>(

Expression.AndAlso(

filter.Body,

Expression.Property(filter.Parameters[0], "Author") == "AuthorA"

),

filter.Parameters

);

用于构建动态查询逻辑

7

8。

表达式树通过将代码逻辑数据化,实现了高度灵活的运行时编程能力,是 C# 动态编程的核心工具之一

1

9。

相关推荐
Scout-leaf3 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
用户298698530143 天前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版
后端·c#·.net
mudtools4 天前
搭建一套.net下能落地的飞书考勤系统
后端·c#·.net
玩泥巴的5 天前
搭建一套.net下能落地的飞书考勤系统
c#·.net·二次开发·飞书
唐宋元明清21885 天前
.NET 本地Db数据库-技术方案选型
windows·c#
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
lindexi5 天前
dotnet DirectX 通过可等待交换链降低输入渲染延迟
c#·directx·d2d·direct2d·vortice
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言