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

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

问题:

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

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

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

3)大多数示例将表达式树与Func委托或其他委托结合使用,因此使用委托和其他编程构造不能实现与表达式服务相同的function。

初学者可以理解的解释非常感谢。

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

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

例如,对于表达式2 + 3我们可以构建和表达树:

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

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

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

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

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

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

 PropertyInfo prop1 = typeof(MyClass).GetProperty("Value"); Expression> expr = mc => mc.Value; PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo; 

Expression是将代码操作表达为对象模型的通用方式。 这在4.0中扩展得更多,但这是我经常使用的一个领域; 我在这里有一些博客点,或者是另一种尝试在InfoQ上解释它的全部内容。 我也曾多次介绍过这个主题 – 也许可以在这里尝试下载(但是如果没有这些话,它就没那么有意义了;对不起)。

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

这是一篇解释基础知识的文章 ……

简而言之:

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

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

3)使用Func <>委托,因为它们用于将表达式表示为可调用函数(在内部编译为MSIL)。

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

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

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

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

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