【问题标题】:Bit Curious to understand Expression Tree in .NET有点好奇理解 .NET 中的表达式树
【发布时间】:2009-10-19 14:22:58
【问题描述】:

我已经阅读了几篇关于表达式树的文章和几篇 stackoverflow.com 帖子。 想明白了,我的大脑都在跳动。

问题:

1)和DOM(Document Object Model)一样,是逻辑的内存表示?

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

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

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

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

【问题讨论】:

  • 顺便说一句。表达式树不是 C# 特有的,所以我改变了你的主题。

标签: c# expression expression-trees


【解决方案1】:

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

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

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

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

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

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

但表达式不是委托,因为它不能直接执行。

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

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

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

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

【讨论】:

    【解决方案2】:

    Expression 是一种将代码操作表示为对象模型的通用方式。这在 4.0 中得到了更多的扩展,但这是我使用 lot 的一个区域;我有一些博客点 here,或者在 InfoQ 上尝试解释这一切。我也多次介绍过这个主题——也许可以尝试下载here(但如果没有这些词,它就没有多大意义;抱歉)。

    我会说实话;这不是一个简单的主题 - 但当您深入了解它时,它会非常强大。综上所述,我可能会从 InfoQ 开始。

    【讨论】:

      【解决方案3】:

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

      简而言之:

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

      2) 它可以编译为 MSIL(或者,在 LINQ-to-SQL 的情况下,也可以编译为其他语言)。

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

      【讨论】:

      • 实际上,Func(和相应的 Action 代表)只是为了方便而存在。您可以使用任何委托类型
      • 天啊!这就是我理解表达式树的教程!!
      【解决方案4】:

      我已尝试在以下博客文章中回答您在 C# 常见问题解答博客中提出的问题:Generating Dynamic Methods with Expression Trees in Visual Studio 2010。所以,是的,它在内存中。我不明白您所说的“用户定义的模式”是什么意思,但是您可以使用它来编写动态代码。不,您不能用委托替换 ET,因为您不能在运行时修改委托。唯一的替代品是 MSIL,它更难读写。

      【讨论】:

        【解决方案5】:

        我不是这方面的专家,但我会尽力为你扫清障碍。

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

        所以,
        1) 我会说是的。
        2)不完全是......你应该先学习这个功能(我也是)然后找到它的好处。你在生成代码吗?这对我来说可能是表达式树的一个非常有用的功能
        3) Expression-tree 它是一个新特性,但没有什么是你以前做不到的。现在更简单了。

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

        【讨论】:

        • @Lucero,很高兴我们都发布了相同的链接 :)
        • 每个人都喜欢查理的表达式树基础知识:D
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 2011-01-11
        相关资源
        最近更新 更多