在C#开发中,表达式树可以将逻辑代码转换为可操作的数据结构,适合需要动态生成比较逻辑的场景,比如动态查询条件构建。下面我们通过简单类型比较的示例,了解表达式树的基础用法。

表达式树基础概念
表达式树属于System.Linq.Expressions命名空间,核心类是Expression,它提供了大量静态方法用于构建不同类型的表达式节点,最终可以编译为可执行的委托。简单类型比较的场景中,我们主要会用到常量表达式、参数表达式和二元比较表达式。
整数比较示例
首先实现两个整数比较的示例,判断输入的整数是否大于指定值:
using System;
using System.Linq.Expressions;
class Program
{
static void Main()
{
// 定义参数表达式,代表输入的整数
ParameterExpression param = Expression.Parameter(typeof(int), "x");
// 定义常量表达式,代表比较的目标值
ConstantExpression constant = Expression.Constant(10, typeof(int));
// 构建大于比较的二元表达式
BinaryExpression greaterThanExpr = Expression.GreaterThan(param, constant);
// 构建lambda表达式,包装比较表达式,指定参数和返回类型
LambdaExpression lambda = Expression.Lambda<Func<int, bool>>(greaterThanExpr, param);
// 编译表达式树为可执行的委托
Func<int, bool> func = (Func<int, bool>)lambda.Compile();
// 测试比较逻辑
Console.WriteLine(func(15)); // 输出True
Console.WriteLine(func(5)); // 输出False
}
}字符串相等比较示例
接下来实现两个字符串是否相等的比较示例:
using System;
using System.Linq.Expressions;
class Program
{
static void Main()
{
// 定义第一个字符串参数
ParameterExpression param1 = Expression.Parameter(typeof(string), "a");
// 定义第二个字符串参数
ParameterExpression param2 = Expression.Parameter(typeof(string), "b");
// 构建相等比较的二元表达式
BinaryExpression equalExpr = Expression.Equal(param1, param2);
// 构建lambda表达式,接收两个字符串参数返回布尔值
LambdaExpression lambda = Expression.Lambda<Func<string, string, bool>>(equalExpr, param1, param2);
// 编译为委托
Func<string, string, bool> func = (Func<string, string, bool>)lambda.Compile();
// 测试比较逻辑
Console.WriteLine(func("test", "test")); // 输出True
Console.WriteLine(func("test", "demo")); // 输出False
}
}代码逻辑说明
上述两个示例的核心步骤是一致的:
- 先定义表达式需要的参数,通过
Expression.Parameter方法创建参数节点 - 如果是和固定值比较,创建常量表达式节点,使用
Expression.Constant方法 - 调用对应的比较方法,比如
Expression.GreaterThan处理大于比较,Expression.Equal处理相等比较,生成二元表达式节点 - 用
Expression.Lambda把比较表达式和参数包装成lambda表达式,明确返回类型 - 调用
Compile方法把表达式树编译为可执行的委托,之后就可以像普通方法一样调用
注意事项
使用表达式树做类型比较时,要注意参与比较的两个类型必须兼容,否则构建表达式时会抛出异常。另外如果需要处理null值比较,可以结合Expression.ReferenceEqual或者先判断null再比较,避免运行时错误。表达式树编译后的委托可以缓存起来重复使用,减少重复编译的开销。
C#表达式树Expression类型比较修改时间:2026-06-07 01:16:02