【已更新最新开发文章,点击查看详细】
但是,表达式树基于一组与 Roslyn API 完全不同的类和 API。
以下是一个代码行:
var sum = 1 + 2;
该表达式被进一步细分为表示加法运算、该加法左操作数和右操作数的表达式。
此处的两个节点都是常量表达式:左操作数是值 1,右操作数是值 2。
直观地看,整个语句是一个树:应从根节点开始,遍历到树中的每个节点,以查看构成语句的代码:
-
具有赋值 (
var sum = 1 + 2;) 的变量声明语句-
赋值运算符 (
=)- 隐式 var 关键字 (
var) - 变量名称声明 (
sum)
- 隐式 var 关键字 (
-
二进制加法表达式 (
1 + 2)- 左操作数 (
1) - 加法运算符 (
+) - 右操作数 (
2)
- 左操作数 (
-
赋值运算符 (
请思考此表达式:
var finalAnswer = this.SecretSauceFunction(currentState.createInterimResult(),
currentState.createSecondValue(1, 2), decisionServer.considerFinalOptions("hello")
)
+ MoreSecretSauce('A', DateTime.Now, true);
该二进制加法运算符可能是对重写的加法运算符的方法调用(具体取决于 SecretSauceFunction() 或 MoreSecretSauce() 的返回类型),解析为对为类定义的二进制加法运算符的静态方法调用。
父节点将具有对其子节点的引用,且每个节点均具有一个用于介绍节点类型的属性。
优美的数据结构说明了 C# 编译器如何分析最复杂的 C# 程序并从该复杂的源代码创建正确的输出。
表达式树的功能非常强大。
还可以将表达式树转换为可执行的委托,并执行代码。
在本系列中看到的那样,表达式树的 API 支持单个循环表达式,该表达式包含控制重复循环的 break 和 continue 表达式。
如果想要改变(更改)表达式树,则必须创建基于原始树副本但包含所需更改的新树。
【已更新最新开发文章,点击查看详细】