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

时间:2009-03-25 21:47:12

标签: c# c#-3.0 lambda expression-trees

当我第一次输入这个问题时,我这样做是为了找到重复的问题,确信有人必须已经问过这个问题。我的计划是遵循这些欺骗链接而不是发布此问题。但据我所知,这个问题以前没有被问过......它没有出现在“相关问题”列表中。

您在C#中深入了解表达式树有哪些最佳资源(文章,书籍,博客文章等)?我一直对此感到惊讶他们的能力,现在我正处于我所说的地步,“好吧,足够的惊喜。我现在想停下来获得这些东西的博士学位。”我正在寻找系统,有条理地涵盖功能的材料,然后详细介绍您可以用它们做些什么。

注意:我不是在谈论lambda表达式。我在说Expression< T>以及与之相关的所有事物都是由它产生的。

感谢。

3 个答案:

答案 0 :(得分:36)

编程Microsoft Linq(ISBN 13:978-0-7356-2400-9或ISBN 10:0-7356-2400-3)的第11章(内部表达树)和第12章(扩展Linq)对于我。我没有读过Jons的书,但他是一个优秀的人并且解释得很好,所以我认为他的报道也很好。

另一个很棒的资源是Bart De Smet's blog

此外,请密切关注MSDN,构建Simple Linq to Database的示例代码(由Pedram Rezaei撰写)即将获得约40页的Doco解释。

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

您还应该尽可能多地了解Expression Tree Visitors,有一个非常好的基类inplementation 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;
    }
    ...

答案 1 :(得分:17)

我并不认为它们是全面的,但我有Expression个帖子on my blog。如果您是英国人,我也将在5月DDD South West Expressionlast night上提交Expression会议,但为时已晚;-p)。我可以发布幻灯片和相关文章中的一些链接,如果你想...不幸的是,一个pptx打算口语很少做出合理的独立阅读。

其他一些阅读(不是来自博客):

(以及microsoft.public.dotnet.languages.csharp上的一大堆帖子   - 尝试搜索:+ expression -regex - “正则表达式”

答案 2 :(得分:5)

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

或者,您可以查看DLR,这是一种类似但不那么优雅的。

相关问题