什么是学习C#表达式树深入的最佳资源?

58
当我第一次输入这个问题时,我是为了找到重复的问题,确信有人已经问过这个问题。我的计划是跟随那些重复链接而不是发布这个问题。但是据我所见,这个问题以前没有被问过...它没有出现在“相关问题”列表中。
你找到的一些最好的资源(文章、书籍、博客文章等)是什么,可以深入了解C#中的表达式树?我总是被它们的能力惊讶,现在我已经到了这个地步:“好了,够了惊喜。我想停下来,获得这些东西的博士学位。”我正在寻找系统、有条理地涵盖这些能力,然后详细介绍你可以用它们做什么的材料。
注意:我不是在谈论Lambda表达式。我谈论的是Expression<T>和与之相关的所有事物。
谢谢。
3个回答

39

《编程Microsoft Linq》的第11章(Inside Expression Trees)和第12章(Extending Linq)对我来说非常有价值。我没有读过Jon的书,但他是一个优秀的人并且讲解得很好,所以我认为他的覆盖范围也会很好。

另一个很棒的资源是Bart De Smet的博客

此外,关注MSDN,构建简单的Linq to Database的示例代码(由Pedram Rezaei编写)即将获得约40页的文档说明。

Expression Tree的一个非常有用的资源实际上我认为它是必备的是Expression Tree Visualiser调试工具

你还应该尽可能多地了解Expression Tree Visitors,这里有一个相当不错的基类实现here

下面是从那个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;
    }
    ...

从我在亚马逊上看到的情况来看,这本书看起来非常不错。谢谢分享。 - Charlie Flowers
5
有关于可视化工具 - 您也可以一行代码实现:http://marcgravell.blogspot.com/2009/03/visualizing-expressions-in-propertygrid.html - Marc Gravell

18

我并不打算让它们变得全面,但我在我的博客上有一些与Expression相关的帖子,可以在这里找到。如果您在英国,我还将在五月份的DDD South West上介绍与Expression有关的内容(昨晚也在演讲,但太晚了;-p)。如果您愿意,我可以发布幻灯片和相关文章的一些链接...不过,pptx通常是用来发言而不是作为独立阅读材料。

其他一些阅读资料(非来自博客):

(还有一堆文章在这里和microsoft.public.dotnet.languages.csharp上 - 尝试搜索:+expression -regex -"正则表达式"


1
+1 - Marc在表达树方面比我认识的任何人都更加熟练。 - Jon Skeet
非常好。我会检查这些东西的。谢谢。 - Charlie Flowers
顺便提一下,我还在InfoQ上发布了一些想法:http://www.infoq.com/articles/expression-compiler - Marc Gravell

5

学习Scheme。表达式使用与λ演算相同的原则,因此可以为您提供更好的洞察力。

或者,您可以查看DLR,它类似但不如Scheme那么优雅。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接