LINQ表达式树最大能做什么?

3

LINQ表达式树的最大作用是什么?

它能定义一个类吗?方法呢?包括所有声明的名称、修饰符、参数类型和返回类型?

程序是否总是需要自己定义树?是否可能从给定的C#文件中生成树?

2个回答

15
在C# 3中,表达式树可以表示表达式。因此它被称为expression tree。并且它们进一步限制为C#表达式的子集--不能有赋值表达式,没有涉及指针类型的表达式等等。
在将与C# 4一起发布的库中,我们扩展了表达式树库以支持语句树。但是,C# 4不会自动将语句lambda转换为“语句树”。
这是一个明显且有用的功能,但由于时间原因,我们无法在C# 4中实现。我们会考虑在假设的未来版本中实现它。如果您有对语句树的真正好用场景,我很想听听。
显然,所有这些的进一步扩展都是声明树,它们将表示类声明、结构声明等等。在C#语言和表达式树库之间具有完全的同源性将是很棒的。它将使各种有趣的元编程方案变得可能。但这不会很快发生,所以不要抱太大希望。那更多是我长期的梦想,可能永远不会实现。

感谢您的回复。这是Expression库的链接:http://msdn.microsoft.com/en-us/library/system.linq.expressions(VS.100).aspx。但我在那里看到了MemberAssignment,它不是用于分配表达式的吗?而这个MethodCallExpression,难道它不能从方法调用中提取信息(被调用者/调用者/参数)吗? - yeeen
不,MemberAssignment 不是用来做那个的。我不明白你的第二个问题。 - Eric Lippert
那么MemberAssignment是用来做什么的呢?我的意思是它能够提取方法调用的细节(被调用者、调用者、参数类型)吗?或者甚至可以使用Expression定义一个方法并调用另一个方法吗? - yeeen
MemberAssignment 用于表示“初始化这个新创建的对象的成员”的概念。这是我们在表达式树中表示匿名类型实例初始化的方式。但与其问我并等待我的回答,为什么不直接阅读您链接到的文档呢?那可能是学习表达式树的更快捷的方式。 - Eric Lippert
嗨Eric,你说过如果有任何关于语句树的好的用户场景,你会很乐意听到的。我有一个:https://dev59.com/tlHTa4cB1Zd3GeqPQU46#3988581 - 我刚被指向这个评论,想让你知道。目前正在使用委托方法解决它,但它不太清晰易读。谢谢! - Lunivore
Eric,如果我们可以使用表达式树构建类型,那将大大提高reflection.Emit库的可用性。我自己发现,为了执行诸如foreachusingfor(;;)这些在C#中有些复杂的代码模式,我不得不编写相当多的辅助方法来处理表达式。通过简单地组合一个foreach并分别访问和替换foreach循环,这样做会容易得多。 - Michael B


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接