学习记录。(4.6)表达式树,泛型
1.表达式树
http://www.cnblogs.com/JeffreyZhao/archive/2009/07/29/expression-tree-fast-evaluation.html
(1)逻辑即数据,Linq to everything
.NET 3.5中新增的表达式树(Expression Tree)特性,第一次在.NET平台中引入了“逻辑即数据”的概念。也就是说,我们可以在代码里使用高级语言的形式编写一段逻辑,但是这段逻辑最终会被保存为数据。正因为如此,我们可以使用各种不同的方法对它进行处理。例如,您可以将其转化为一个SQL查询,或者外部服务调用等等,这便是LINQ to Everything在技术实现上的重要基石之一。
2.泛型的一个问题。
(1)在泛型类中定义静态字段的时候一定要注意:不同泛型参数生成的具体类(无论是值类型还是引用类型),它们的静态字段是独立的。
3. 表达式树开发人员指南。
ms-help://MS.MSDNQTR.v90.chs/dv_fxadvance/html/fb1d3ed8-d5b0-4211-a71f-dd271529294b.htm
System.Linq.Expressions:提供了用于手动生成表达式树的API
Expression 以表达式目录树的形式,把强类型lambda表达式表示为数据结构.提供大量静态工厂。
表达式树的根节点为,Expression<TDelegate> 表示一个lambda表达式。
并且可以自动把这个lambda表达式分解为表达式目录树,存储起来。
????????????????????
1.Express可以不表示Lambda,那表达的是什么?
Lambda表达式定义。
2.lambda表示匿名函数。,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型
2.Lambda 语句无法用于创建表达式目录树。
Lambda 的一般规则如下:
-
Lambda 包含的参数数量必须与委托类型包含的参数数量相同。
-
Lambda 中的每个输入参数必须都能够隐式转换为其对应的委托参数。
-
Lambda 的返回值(如果有)必须能够隐式转换为委托的返回类型。
请注意,Lambda 表达式本身没有类型,因为通用类型系统没有“Lambda 表达式”这一内部概念。但是,有时会不正式地论及 Lambda 表达式的“类型”。在这些情况下,类型是指委托类型或 Lambda 表达式所转换为的 Expression 类型。
构建表达式树。
只能执行表示 lambda 表达式的表达式目录树。表示 lambda 表达式的表达式目录树属于 LambdaExpression 或 Expression<(Of <(TDelegate>)>) 类型。若要执行这些表达式目录树,需要调用 Compile 方法来创建一个可执行委托,然后调用该委托。
(0)通过expression的静态方法,构建出Expression<TDelegate>。
(1)调用compile,创建一个可执行的委托。