有点理解.NET中的表达式树

时间:2009-10-19 14:22:58

标签: c# expression expression-trees

我已经阅读了几篇关于表达式树的文章和几篇 stackoverflow.com 帖子。 它让我的大脑明白了。

问题:

1)与DOM(文档对象模型)一样,它是逻辑内存表示吗?

2)有人解释说这是一种将可执行​​代码转换为数据的机制,使用它可以生成代表代码的数据结构。

是否意味着,表达式树用于设计用户定义的模式?

3)大多数示例将表达式树与Func<>委托或其他委托一起显示,因此使用委托和其他编程构造不能实现与表达式树相同的事情供应。

初学者可以理解的解释非常受欢迎。

5 个答案:

答案 0 :(得分:16)

表达式树表示单个表达式的语法树。

树的每个节点代表一些常量,对象成员引用或操作。

E.g。对于表达式2 + 3,我们可以构建和表达树:

Expression.MakeBinary(
    ExpressionType.Add,
    Expression.Constant(2),
    Expression.Constant(3));

这些树中最重要的是Expression,它允许以很好的可读形式编写表达式,提醒签名匹配TDelegate的lambda函数。这是前任

Expression<Func<int>> sum = () => 2 + 3; // much nicer, eh?

但Expression不是委托,因为它无法直接执行。

相反,它可以遍历,例如使用visitor对象构建一些可执行表示。示例可以是使用CompiledQuery.Compile()等从LINQ查询构建的Expression.Compile()或SQL查询的委托构建。

表达式树的另一个有用的应用是使用它们来表示否则需要使用Reflection的对象的成员。 Reflection使用字符串表示成员名称,并且在编译时不进行检查。检查表达式树,因此可以减少一些错误。

PropertyInfo prop1 = typeof(MyClass).GetProperty("Value");

Expression<Func<MyClass, int>> expr = mc => mc.Value;
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo;

答案 1 :(得分:10)

Expression是一种将代码操作表示为对象模型的通用方法。这在4.0中扩展得更多,但这是我使用 lot 的区域;我有一些博客点here,或者另外尝试在InfoQ上解释所有这些点。我也曾多次介绍过这个主题 - 或者尝试下载here(但如果没有这些话就不会有意义;对不起)。

我会诚实的;它不是一个简单的主题 - 但是当你理解它时它强大非常强大。从上面开始,我可能会从InfoQ开始。

答案 2 :(得分:3)

Here's an article解释了基础......

简而言之:

1)基本上,是的,它是逻辑的内存表示。

2)它可以编译为MSIL(或者,就像LINQ-to-SQL也适用于其他语言)。

3)Func&lt;&gt;使用委托是因为它们用于将表达式表示为可调用函数(在内部编译为MSIL)。

答案 3 :(得分:2)

我试图在以下博文中回答C#FAQ博客上的问题:Generating Dynamic Methods with Expression Trees in Visual Studio 2010。所以,是的,它是在内存中。我不明白你的意思是“用户定义的模式”,但你可以用它来编写动态代码。不,您不能用代理替换ET,因为您无法在运行时修改代理。唯一的替代品可能是MSIL,它更难以读写。

答案 4 :(得分:1)

我不是这方面的专家,但我会试着清除道路。

将表达式树视为类型反射。这是一种了解函数功能的简单方法,比如操作数,参数和内容。

所以,
1)我会说,是的 2)不完全......你应该首先学习这个特征(我也是),然后找到它有用的东西。你在生成代码吗?对我而言,这可能是表达树的一个非常有用的特征 3)表达式树它是一个新功能,但以前没有什么是你不能做的。现在它更容易了。

有一篇很好的文章here解释了基础知识。