初识System.Linq.Expressions
本文介绍.Net Framework 3.5中,命名空间System.Linq.Expressions下有关类的使用。
我们先来了解下Lambda表达式,在VS2008中,Lambda被编译成两种形式:一种是IL语言,另一种是Expression,即本文介绍的表达式。实现这两种方式,是出于不同用途的考虑。像Linq To SQL中,Lambda表达式在执行的过程中,被翻译成SQL语句并执行,而在普通的Lambda表达式中,则是和其他表达式相同,翻译成二进制代码执行。
看下面的Lambda表达式:
Func<int> func1 = ()=> 1+1; int result1 = func1(); |
这个表达式非常简单,就是计算1+1。Lambda表达式返回的是Delegate,如上,这个Delegate就是Func<int>。在使用这个Lambda表达式时候,我们就调用Delegate。
编译器的工作,是把上面的代码翻译成下面的代码:
ConstantExpression exp1 = Expression.Constant(1); ConstantExpression exp2 = Expression.Constant(1); BinaryExpression exp3 = Expression.Add(exp1, exp2); Expression<Func<int>> exp4 = Expression.Lambda<Func<int>>(exp3); Func<int> func = exp4.Compile(); int result = func(); |
先把1+1翻译成两个常量表达式ConstantExpression exp1, exp2,然后将这两个表达式加起来,变成一个二元表达式BinaryExpression,再把这个二元表达式转换成Lambda表达式。可以说,前面4行和第一段代码的第1行等号右边的Lambda表达式等同。
为了得到可以执行的代码,需要把表达式编译,第5行编译并返回编译后的代理func。
通过反编译System.Core.dll,可以看到,这里编译其实是利用动态方法技术,生成一个代理。
代码在编译以后是固定不变的,而表达式我们可以随意组合,这样,我们通过各种方式组合表达式,来灵活实现各种业务。比如在软件中实现公式功能,自定义查询等。
接下来我将会利用表达式,编写一个四则计算器:
欢迎关注!