你找到的一些最好的资源(文章、书籍、博客文章等)是什么,可以深入了解C#中的表达式树?我总是被它们的能力惊讶,现在我已经到了这个地步:“好了,够了惊喜。我想停下来,获得这些东西的博士学位。”我正在寻找系统、有条理地涵盖这些能力,然后详细介绍你可以用它们做什么的材料。
注意:我不是在谈论Lambda表达式。我谈论的是Expression<T>和与之相关的所有事物。
谢谢。
《编程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;
}
...
我并不打算让它们变得全面,但我在我的博客上有一些与Expression
相关的帖子,可以在这里找到。如果您在英国,我还将在五月份的DDD South West上介绍与Expression
有关的内容(昨晚也在演讲,但太晚了;-p)。如果您愿意,我可以发布幻灯片和相关文章的一些链接...不过,pptx通常是用来发言而不是作为独立阅读材料。
其他一些阅读资料(非来自博客):
Expression
进行遗传编程Expression
进行泛型运算符Expression
作为编译器(还有一堆文章在这里和microsoft.public.dotnet.languages.csharp上 - 尝试搜索:+expression -regex -"正则表达式"
学习Scheme。表达式使用与λ演算相同的原则,因此可以为您提供更好的洞察力。
或者,您可以查看DLR,它类似但不如Scheme那么优雅。