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

作者: TerryLee  來源: 博客園  發布時間: 2008-09-19 23:10  閱讀: 57647 次  推薦: 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] 為什么需要表達式目錄樹和總結

概述

在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其強大而優雅的編程方式贏得了開發人員的喜愛,而各種LINQ Provider更是滿天飛,如LINQ to NHibernate、LINQ to Google等,大有“一切皆LINQ”的趨勢。LINQ本身也提供了很好的擴展性,使得我們可以輕松的編寫屬于自己的LINQ Provider。

本文為打造自己的LINQ Provider系列文章第一篇,主要介紹表達式目錄樹(Expression Tree)的相關知識。

認識表達式目錄樹

究竟什么是表達式目錄樹(Expression Tree),它是一種抽象語法樹或者說它是一種數據結構,通過解析表達式目錄樹,可以實現我們一些特定的功能(后面會說到),我們首先來看看如何構造出一個表達式目錄樹,最簡單的方法莫過于使用Lambda表達式,看下面的代碼:

Expression<Func<int, int, int>> expression = (a, b) => a * b + 2;

在我們將Lambda表達式指定給Expression<TDelegate>類型的變量(參數)時,編譯器將會發出生成表達式目錄樹的指令,如上面這段代碼中的Lambda表達式(a, b) => a * b + 2將創建一個表達式目錄樹,它表示的是一種數據結構,即我們把一行代碼用數據結構的形式表示了出來,具體來說最終構造出來的表達式目錄樹形狀如下圖所示:

TerryLee_0160

這里每一個節點都表示一個表達式,可能是一個二元運算,也可能是一個常量或者參數等,如上圖中的ParameterExpression就是一個參數表達式,ConstantExpression是一個常量表達式,BinaryExpression是一個二元表達式。我們也可以在Visual Studio中使用Expression Tree Visualizer來查看該表達式目錄樹:

TerryLee_0166

查看結果如下圖所示:

TerryLee_0162

4
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()