Expression Tree 上手指南 (三)
2009/10/18 18:46 存档上回我们说到手工解析Expression Tree,以便获得其中的逻辑或者执行我们自定义的语义动作。这种做法扩展了C#语言的威力,让我们可以用C#的语法来做更多的事情,例如Linq to Sql。今天我们要学习一种相反的做法,手工创建表达式树,然后让.NET来解析它。这是一种强大的动态编程手段。我们可以用它来完成许多以前需要Reflection.Emit才能完成的任务。
上回我们说到手工解析Expression Tree,以便获得其中的逻辑或者执行我们自定义的语义动作。这种做法扩展了C#语言的威力,让我们可以用C#的语法来做更多的事情,例如Linq to Sql。今天我们要学习一种相反的做法,手工创建表达式树,然后让.NET来解析它。这是一种强大的动态编程手段。我们可以用它来完成许多以前需要Reflection.Emit才能完成的任务。
上回我们说到Expression Tree是一种表示编程语言中“表达式”概念的树状数据结构,并且学习了从Lambda表达式自动生成表达式树的C#语法。那么它到底有什么用呢?其实上一回已经提到了Expression Tree的基本功能:分析表达式的逻辑、保存和传输表达式以及重新编译表达式。现在我们就分别来看这三项基本功能如何使用。
大家可能都知道Expression Tree是.NET 3.5引入的新增功能。不少朋友们已经听说过这一特性,但还没来得及了解。看看博客园里的老赵等诸多牛人,将Expression Tree玩得眼花缭乱,是否常常觉得有点落伍了呢?其实Expression Tree是一个一点就透的特性,只要对其基本概念有了一定的了解,就可以自己发挥出无数的用法。特别是之前对Reflection,泛型等知识有过一些了解的话,就会发现Expression Tree的加入绝对是你工作中的得力助手。如果你是Expression Tree的新手,那么从本文开始,你就可以领略这一工具,之后再看老赵的文章就从容不迫了~
| 字符 | 说明 | 示例 | 输出 |
| C | 货币 | string.Format("{0:C3}", 2) | $2.000 |
| D | 十进制 | string.Format("{0:D3}", 2) | 002 |
| E | 科学计数法 | 1.20E+001 | 1.20E+001 |
| G | 常规 | string.Format("{0:G}", 2) | 2 |
| N | 用分号隔开的数字 | string.Format("{0:N}", 250000) | 250,000.00 |
| X | 十六进制 | string.Format("{0:X000}", 12) | C |
| string.Format("{0:000.000}", 12.2) | 012.200 |