0Pricing
C# Academy · 课时

手动构建表达式

使用 Expression API 构建表达式树。

手动构建表达式 是 CoddyKit 上的免费 C# Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

手动构建表达式树

除了让编译器根据 Lambda 构建表达式树之外,您还可以使用Expression上的静态工厂方法自行构建表达式树。

using System;
using System.Linq.Expressions;

var five = Expression.Constant(5);
Console.WriteLine(five);          // 5
Console.WriteLine(five.Type);     // System.Int32

参数节点工厂方法

Expression.Parameter(type, name)会创建一个参数节点,您可以在 body 中引用它,并将它绑定到 Lambda 中。

using System;
using System.Linq.Expressions;

var x = Expression.Parameter(typeof(int), "x");
Console.WriteLine(x.Name + " : " + x.Type); // x : System.Int32

常量节点工厂方法

Expression.Constant(value)会嵌入一个字面值。您还可以选择指定其类型。

using System;
using System.Linq.Expressions;

var c = Expression.Constant(42);
var typed = Expression.Constant(3.14, typeof(double));
Console.WriteLine(c + " " + typed); // 42 3.14

加法节点工厂方法

二元运算符都有对应的工厂方法,例如Expression.Add。这些方法接收两个操作数表达式,并构建一个BinaryExpression。

using System;
using System.Linq.Expressions;

var x = Expression.Parameter(typeof(int), "x");
var sum = Expression.Add(x, Expression.Constant(1));
Console.WriteLine(sum); // (x + 1)

其他二元运算符

完整的运算符集合都有对应的工厂方法:Subtract、Multiply、Divide、GreaterThan、Equal等。

using System;
using System.Linq.Expressions;

var x = Expression.Parameter(typeof(int), "x");
var gt = Expression.GreaterThan(x, Expression.Constant(10));
var mul = Expression.Multiply(x, Expression.Constant(2));
Console.WriteLine(gt + " | " + mul); // (x > 10) | (x * 2)

封装为 Lambda

Expression.Lambda会将 body 和参数组合成一个之后可以编译的Expression<TDelegate>。

using System;
using System.Linq.Expressions;

var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Add(x, Expression.Constant(1));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
Console.WriteLine(lambda); // x => (x + 1)

组合嵌套表达式

工厂方法可以自由嵌套,因此您可以逐步构建类似(x + 1) * 2这样的复杂表达式。

using System;
using System.Linq.Expressions;

var x = Expression.Parameter(typeof(int), "x");
var addOne = Expression.Add(x, Expression.Constant(1));
var timesTwo = Expression.Multiply(addOne, Expression.Constant(2));
Console.WriteLine(timesTwo); // ((x + 1) * 2)

成员访问

Expression.Property和Expression.Field会构建成员访问节点。

using System;
using System.Linq.Expressions;

var s = Expression.Parameter(typeof(string), "s");
var lengthAccess = Expression.Property(s, "Length");
Console.WriteLine(lengthAccess); // s.Length

方法调用

给定目标、方法和参数后,Expression.Call会构建一个调用节点。

using System;
using System.Linq.Expressions;

var s = Expression.Parameter(typeof(string), "s");
var toUpper = typeof(string).GetMethod("ToUpper", Type.EmptyTypes);
var call = Expression.Call(s, toUpper);
Console.WriteLine(call); // s.ToUpper()

构建时进行类型检查

工厂方法会在构建过程中验证操作数类型。类型不匹配时会立即抛出异常,从而尽早发现错误。

using System;
using System.Linq.Expressions;

try {
    var bad = Expression.Add(
        Expression.Constant(1),
        Expression.Constant("text")); // int + string
} catch (InvalidOperationException) {
    Console.WriteLine("type mismatch rejected");
}

综合运用

完全手动构建 Lambda:x => (x + 1) * 2。

using System;
using System.Linq.Expressions;

var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Multiply(
    Expression.Add(x, Expression.Constant(1)),
    Expression.Constant(2));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
Console.WriteLine(lambda); // x => ((x + 1) * 2)

快速检查

请确认手动构建表达式的工作方式。

回顾

您已经学习了如何手动构建表达式树。

  • Expression.Parameter和Expression.Constant会创建叶节点。
  • Expression.Add及其相关方法会构建二元运算。
  • Expression.Property和Expression.Call用于处理成员和方法。
  • Expression.Lambda会组装出可调用的表达式树。

常见问题解答

「手动构建表达式」课时是免费的吗?

是的 — 「手动构建表达式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「手动构建表达式」这节课中我会学到什么?

使用 Expression API 构建表达式树。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「手动构建表达式」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是表达式树
  2. 手动构建表达式
  3. 编译和执行表达式
  4. LINQ 提供程序中的表达式树
← 返回 C# Academy