当我第一次输入这个问题时,我这样做是为了找到重复的问题,确信有人必须已经问过这个问题。我的计划是遵循这些欺骗链接而不是发布此问题。但据我所知,这个问题以前没有被问过......它没有出现在“相关问题”列表中。
您在C#中深入了解表达式树有哪些最佳资源(文章,书籍,博客文章等)?我一直对此感到惊讶他们的能力,现在我正处于我所说的地步,“好吧,足够的惊喜。我现在想停下来获得这些东西的博士学位。”我正在寻找系统,有条理地涵盖功能的材料,然后详细介绍您可以用它们做些什么。
注意:我不是在谈论lambda表达式。我在说Expression< T>以及与之相关的所有事物都是由它产生的。
感谢。
答案 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 Expression
和last night上提交Expression
会议,但为时已晚;-p)。我可以发布幻灯片和相关文章中的一些链接,如果你想...不幸的是,一个pptx打算口语很少做出合理的独立阅读。
其他一些阅读(不是来自博客):
Expression
Expression
as a Compiler (以及microsoft.public.dotnet.languages.csharp上的一大堆帖子 - 尝试搜索:+ expression -regex - “正则表达式”
答案 2 :(得分:5)
学习计划。表达式使用与lambda演算相同的原则,因此可以为您提供更好的洞察力。
或者,您可以查看DLR,这是一种类似但不那么优雅的。