您的位置:知识库 »

打造自己的LINQ Provider(上):Expression Tree揭秘

作者: TerryLee  来源: 博客园  发布时间: 2008-09-19 23:10  阅读: 58537 次  推荐: 4   原文链接   [收藏]  
摘要:在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞,如LINQ to NHibernate、LINQ to Google等,大有“一切皆LINQ”的趋势。LINQ本身也提供了很好的扩展性,使得我们可以轻松的编写属于自己的LINQ Provider。
[1] 认识表达式目录树1
[2] 认识表达式目录树2
[3] 表达式目录树与委托
[4] 执行表达式目录树
[5] 访问与修改表达式目录树
[6] 为什么需要表达式目录树和总结

这里说一句,Expression Tree Visualizer可以从MSDN Code Gallery上的LINQ Sample中得到。现在我们知道了表达式目录树的组成,来看看.NET Framework到底提供了哪些表达式?如下图所示:

TerryLee_0161

它们都继承于抽象的基类Expression,而泛型的Expression<TDelegate>则继承于LambdaExpression。在Expression类中提供了大量的工厂方法,这些方法负责创建以上各种表达式对象,如调用Add()方法将创建一个表示不进行溢出检查的算术加法运算的BinaryExpression对象,调用Lambda方法将创建一个表示lambda 表达式的LambdaExpression对象,具体提供的方法大家可以查阅MSDN。上面构造表达式目录树时我们使用了Lambda表达式,现在我们看一下如何通过这些表达式对象手工构造出一个表达式目录树,如下代码所示:

static void Main(string[] args)
{
    ParameterExpression paraLeft = Expression.Parameter(typeof(int), "a");
    ParameterExpression paraRight = Expression.Parameter(typeof(int), "b");
 
    BinaryExpression binaryLeft = Expression.Multiply(paraLeft, paraRight);
    ConstantExpression conRight = Expression.Constant(2, typeof(int));
 
    BinaryExpression binaryBody = Expression.Add(binaryLeft, conRight);
 
    LambdaExpression lambda = 
        Expression.Lambda<Func<int, int, int>>(binaryBody, paraLeft, paraRight);
 
    Console.WriteLine(lambda.ToString());
 
    Console.Read();
}

这里构造的表达式目录树,仍然如下图所示:

TerryLee_0160

运行这段代码,看看输出了什么:

TerryLee_0158  

可以看到,通过手工构造的方式,我们确实构造出了同前面一样的Lambda表达式。对于一个表达式目录树来说,它有几个比较重要的属性:

Body:指表达式的主体部分;

Parameters:指表达式的参数;

NodeType:指表达式的节点类型,如在上面的例子中,它的节点类型是Lambda;

Type:指表达式的静态类型,在上面的例子中,Type为Fun<int,int,int>。

在Expression Tree Visualizer中,我们可以看到表达式目录树的相关属性,如下图所示:

TerryLee_0163 

4
0

热门文章

    最新文章

      最新新闻

        热门新闻