编辑
2025-09-17
C#
00

目录

什么是表达式树?
创建一个简单的表达式树
动态表达式构建
DynamicQueryBuilder
使用表达式树的实际应用
总结

表达式树是 C# 中一个强大的特性,它允许你动态地构建、解析和计算表达式。通过使用表达式树,你可以在运行时构建 LINQ 查询,创建自定义查询解析器,甚至在没有编译的情况下生成代码。本文将深入探讨如何使用表达式树来实现动态表达式解析与计算。

什么是表达式树?

表达式树(Expression Trees)是一种特殊的树结构,表示代码的语法结构。它们是以非常灵活的方式构建并可以在运行时执行,这使得它们在编写动态查询、构建自定义 LINQ 提供程序以及进行代码分析时非常有用。

创建一个简单的表达式树

首先,我们将创建一个简单的表达式树来表示一个加法操作。下面的示例演示了如何构建一个加法的表达式树并计算结果:

C#
using System; using System.Linq.Expressions; class Program { static void Main() { // 创建表达式树:x + y ParameterExpression x = Expression.Parameter(typeof(int), "x"); ParameterExpression y = Expression.Parameter(typeof(int), "y"); BinaryExpression addExpression = Expression.Add(x, y); // 创建一个表达式树,表示一个带有参数的 lambda 表达式 var lambda = Expression.Lambda<Func<int, int, int>>(addExpression, x, y); // 编译表达式树为可执行的代码 var compiledLambda = lambda.Compile(); // 计算 3 + 5 int result = compiledLambda(3, 5); Console.WriteLine($"Result: {result}"); } }

image.png 在这个示例中,我们完成了以下几步:

  • 定义了两个参数 xy
  • 创建了一个 BinaryExpression,表示 x + y 的操作。
  • 创建了一个 Lambda 表达式。
  • 最后,编译并执行表达式,输出结果为 8。

动态表达式构建

在许多情况下,你可能需要根据用户输入或者其他动态内容构建表达式。在下面的示例中,我们将根据输入的操作符动态构建不同的数学表达式:

C#
using System; using System.Linq.Expressions; class Program { static void Main() { Console.WriteLine("请输入操作符 (+, -, *, /):"); string operation = Console.ReadLine(); ParameterExpression x = Expression.Parameter(typeof(int), "x"); ParameterExpression y = Expression.Parameter(typeof(int), "y"); BinaryExpression binaryExpression; switch (operation) { case "+": binaryExpression = Expression.Add(x, y); break; case "-": binaryExpression = Expression.Subtract(x, y); break; case "*": binaryExpression = Expression.Multiply(x, y); break; case "/": binaryExpression = Expression.Divide(x, y); break; default: throw new InvalidOperationException("无效的操作符"); } var lambda = Expression.Lambda<Func<int, int, int>>(binaryExpression, x, y); var compiledLambda = lambda.Compile(); // 示例输入,计算 int result = compiledLambda(8, 4); Console.WriteLine($"结果: {result}"); } }

image.png 在上述示例中,我们根据用户输入的操作符动态选择适当的运算。在获得有效操作符后,我们创建了对应的表达式树,并计算出结果。

DynamicQueryBuilder

DynamicQueryBuilder 类提供了一个静态方法 BuildWhereCondition,用于动态构建 LINQ 查询的 Where 条件。下面是一个完整示例,展示了如何使用这个类,以及一个简单的应用程序来演示动态查询功能:

C#
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; public class DynamicQueryBuilder { public static Expression<Func<T, bool>> BuildWhereCondition<T>( string propertyName, object value, ExpressionType compareType = ExpressionType.Equal) { ParameterExpression parameter = Expression.Parameter(typeof(T), "x"); MemberExpression property = Expression.Property(parameter, propertyName); ConstantExpression constantExpression = Expression.Constant(value); BinaryExpression body = Expression.MakeBinary( compareType, property, constantExpression ); return Expression.Lambda<Func<T, bool>>(body, parameter); } } // 示例实体类 public class Person { public string Name { get; set; } public int Age { get; set; } } public class Program { public static void Main() { // 创建示例数据 List<Person> people = new List<Person> { new Person { Name = "Alice", Age = 30 }, new Person { Name = "Bob", Age = 25 }, new Person { Name = "Charlie", Age = 35 } }; // 动态构建查询条件 - 查找年龄大于25的人 var ageCondition = DynamicQueryBuilder.BuildWhereCondition<Person>("Age", 25, ExpressionType.GreaterThan); // 使用 LINQ 查询 var result = people.AsQueryable().Where(ageCondition).ToList(); // 输出结果 foreach (var person in result) { Console.WriteLine($"{person.Name}, Age: {person.Age}"); } } }

DynamicQueryBuilder:这是一个构建动态查询条件的类,BuildWhereCondition 方法接受属性名称、比较值和比较类型(默认为相等)并返回一个表达式树,表示给定条件。

image.png

使用表达式树的实际应用

表达式树在以下场景中表现十分出色:

  • 动态 LINQ 查询:可以构建动态的 LINQ 查询,将条件和结果转换为表达式树。
  • 可扩展性:通过表达式树可以实现动态组合查询,允许用户自定义查询结构并将其转化为具体的表达式。
  • 性能优化:预编译的表达式树可以在多次调用中显著提高性能。

总结

表达式树是 C# 中一种强大的编程工具,允许你在运行时动态构建和执行代码。它们在需要灵活查询和计算逻辑的情况下尤其有用。通过本文中的示例,你应该能够开始使用表达式树进行动态表达式解析与计算的旅程。

借助表达式树的优势,你可以在你的应用程序中实现更高级的功能,提升用户体验及系统性能。希望你能在实际项目中探索并应用这一强大的工具。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!