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

6 c# expression expression-trees

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

问题:

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

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

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

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

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

eld*_*rge 16

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

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

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

Expression.MakeBinary(
    ExpressionType.Add,
    Expression.Constant(2),
    Expression.Constant(3));
Run Code Online (Sandbox Code Playgroud)

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

Expression<Func<int>> sum = () => 2 + 3; // much nicer, eh?
Run Code Online (Sandbox Code Playgroud)

但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;
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 10

Expression是一种将代码操作表示为对象模型的通用方法.这是延长4.0得多,但是这是我使用的面积很多 ; 我在这里有一些博客点,或者是另一种尝试在InfoQ上解释它的全部内容.我也曾多次介绍过这个主题 - 也许可以在这里尝试下载(但是如果没有这些话,它就没那么有意义了;对不起).

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