我已经阅读了几篇关于表达式树的文章和几篇 stackoverflow.com 帖子。 它让我的大脑明白了。
问题:
1)与DOM(文档对象模型)一样,它是逻辑内存表示吗?
2)有人解释说这是一种将可执行代码转换为数据的机制,使用它可以生成代表代码的数据结构。
是否意味着,表达式树用于设计用户定义的模式?
3)大多数示例将表达式树与Func<>
委托或其他委托一起显示,因此使用委托和其他编程构造不能实现与表达式树相同的事情供应。
的
初学者可以理解的解释非常受欢迎。
答案 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解释了基础知识。