當我第一次輸入這個問題時,我這樣做是為了找到重複的問題,確信有人必須已經問過這個問題。我的計劃是遵循這些欺騙鏈接而不是發布此問題。但據我所知,這個問題以前沒有被問過......它沒有出現在“相關問題”列表中。
您在C#中深入理解表達式樹有哪些最佳資源(文章,書籍,博客文章等)?我一直對他們的能力感到驚訝,現在我正處在我說的地方,“好吧,足夠的驚喜。我現在想停下來並獲得這些東西的博士學位。”我正在尋找系統,有條理地涵蓋功能的材料,然後詳細介紹您可以使用它們做什麼。
注意:我不是在談論lambda表達式。我在談論Expression <T>以及隨之而來的所有事情。
謝謝。
編程Microsoft Linq(ISBN 13:978-0-7356-2400-9或ISBN 10:0-7356-2400-3)的第11章(內部表達樹)和第12章(擴展Linq)對我來說非常寶貴。我沒有讀過Jons的書,但他是一個優秀的人並且解釋得很好,所以我認為他的報導也很好。
另一個很好的資源是Bart De Smet的博客
此外,請密切關注MSDN,構建Simple Linq to Database (由Pedram Rezaei編寫)的示例代碼即將獲得大約40頁的Doco解釋它。
對於Expression Tree來說,一個非常非常有用的資源實際上我認為它必須具備 Expression Tree Visualiser調試工具。
你也應該學習盡可能多地了解表達式樹遊客,有一個相當不錯的基類inplementation 這裡 。
下面是一些從該Visitor類派生的示例代碼,用於進行一些調試(我基於我提到的書中的一些示例代碼)prependIndent方法調用只是一個字符串的擴展方法,在每個縮進處放置一個“ - ”水平。
internal class DebugDisplayTree : ExpressionVisitor
{
private int indentLevel = 0;
protected override System.Linq.Expressions.Expression Visit(Expression exp)
{
if (exp != null)
{
Trace.WriteLine(string.Format("{0} : {1} ", exp.NodeType, exp.GetType().ToString()).PrependIndent(indentLevel));
}
indentLevel++;
Expression result = base.Visit(exp);
indentLevel--;
return result;
}
...
我並不認為它們是全面的,但我的博客上有很多Expression
帖子。如果你是英國人,我也將在5月份在DDD西南地區舉辦關於Expression
的會議( 昨晚 ,但為時已晚;-p)。我可以發布幻燈片和相關文章中的一些鏈接,如果你想...不幸的是,一個打算用語言的pptx很少能做出合理的獨立閱讀。
其他一些閱讀(不是來自博客):
Expression
遺傳編程 Expression
泛型運算符 Expression
作為編譯器 (以及在microsoft.public.dotnet.languages.csharp上的一大堆帖子 - 嘗試搜索:+ expression -regex - “正則表達式”