深入学习 C# 表达式树的最佳资源是什么?
-
22-08-2019 - |
题
当我第一次输入这个问题时,我这样做是为了找到重复的问题,我确信一定有人已经问过这个问题。我的计划是关注那些重复的链接,而不是发布这个问题。但据我所知,这个问题以前没有被问过......它没有出现在“相关问题”列表中。
您找到了哪些用于深入了解 C# 表达式树的最佳资源(文章、书籍、博客文章等)? 我一直对他们的能力感到惊讶,现在我想说的是,“好吧,足够的惊喜了。我想立即停下来,获得这些方面的博士学位。”我正在寻找能够系统、有条理地涵盖这些功能的材料,然后详细介绍您可以使用它们做什么。
笔记:我不是在谈论 lambda 表达式。我说的是 Expression<T> 以及所有与之相关并由其产生的事物。
谢谢。
解决方案
《Programming Microsoft Linq》(ISBN 13:)的第 11 章(表达式树内部)和第 12 章(扩展 Linq)978-0-7356-2400-9 或 ISBN 10:0-7356-2400-3)对我来说非常宝贵。我没有读过乔恩的书,但他是一个很有素质的人,并且解释得很好,所以我认为他的报道也很好。
另一个很棒的资源是 巴特·德·斯梅特的博客
另外,请密切关注 MSDN,这是用于构建 简单的 Linq 到数据库 (作者 Pedram Rezaei)即将收到 Doco 大约 40 页的解释。
事实上,对于表达式树来说,这是一个非常非常有用的资源,我将其视为 一定有 是个 表达式树可视化工具 调试工具。
您还应该尽可能多地了解表达式树访问者,有一个非常好的基类实现 这里.
这是从该 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
帖子 在我的博客上. 。如果您在英国,我还将举办一场关于 Expression
在 国内长途 西南 五月(和 昨夜, ,但为时已晚;-p)。如果您愿意,我可以发布幻灯片和相关文章中的一些链接...不幸的是,pptx 的目的是 说 很少进行有意义的独立阅读。
其他一些阅读(不是来自博客):
- 贾森·博克: 遗传编程 和
Expression
- (又是我): 通用运算符 和
Expression
- (再次,在 InfoQ 上)
Expression
作为编译器
(以及此处以及Microsoft.public.dotnet.languages.csharp的全部帖子 - 尝试搜索:+表达式-正则表达式-“正则表达式”
了解方案。表达式中使用相同的原则演算,因此会给你一些更好的洞察力。
另外,还可以看DLR,这是一种类似的但更优雅。