57

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

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

注意:我不是在谈论 lambda 表达式。我说的是Expression< T > 以及所有与它相关并由此产生的东西。

谢谢。

4

3 回答 3

39

Programming 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调试工具。

您还应该尽可能多地了解表达式树访问者,这里有一个非常好的基类实现

这是从该访问者类派生的一些示例代码,用于进行一些调试(我基于我提到的书中的一些示例代码) 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;
    }
    ...
于 2009-03-25T22:20:33.957 回答
18

我不认为它们是全面的,但我的博客上Expression有很多帖子。如果您是英国人,我还将在 5 月(以及昨晚,但为时已晚;-p)在DDD South West举办一次会议。如果您愿意,我可以发布幻灯片和相关文章中的一些链接......不幸的是,一个打算被说出来的 pptx很少能做出明智的独立阅读。Expression

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

(以及这里和 microsoft.public.dotnet.languages.csharp 上的大量帖子 - 尝试搜索:+expression -regex -"regular expression"

于 2009-03-26T08:28:58.067 回答
5

学习方案。表达式使用与 lambda 演算相同的原理,因此会给你一些更好的洞察力。

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

于 2009-03-26T11:32:50.650 回答