当我第一次输入这个问题时,我这样做是为了找到重复的问题,确信有人必须已经问过这个问题.我的计划是遵循这些欺骗链接而不是发布此问题.但据我所知,这个问题以前没有被问过......它没有出现在"相关问题"列表中.
为了深入了解C#中的表达式树,你找到了哪些最好的资源(文章,书籍,博客文章等)? 我一直对他们的能力感到惊讶,现在我正处在我说的地方,"好吧,足够的惊喜.我现在想停下来获得这些东西的博士学位." 我正在寻找系统,有条理地涵盖功能的材料,然后详细介绍了如何使用它们.
注意:我不是在谈论lambda表达式.我在谈论Expression
谢谢.
编程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解释它.
为表达一个非常,非常有用的资源树的,其实我也认为这是一个必须是表达式树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西南部举行会议(昨晚,但为时已晚;-p).我可以发布幻灯片和相关文章中的一些链接,如果你想...不幸的是,一个pptx打算说话很少做出明智的独立阅读.Expression
其他一些阅读(不是来自博客):
杰森博克:遗传编程与Expression
(再次我):一般的运营商与Expression
(再次,在InfoQ上)Expression
作为编译器
(以及在microsoft.public.dotnet.languages.csharp上的一大堆帖子 - 尝试搜索:+ expression -regex - "正则表达式"
学习计划.表达式使用与lambda演算相同的原则,因此可以为您提供更好的洞察力.
或者,你可以看看DLR,这是一个类似但不那么优雅的.