代码之家  ›  专栏  ›  技术社区  ›  Yaron Naveh

C 4.0:表达式树与codedom

  •  9
  • Yaron Naveh  · 技术社区  · 15 年前

    表达式树和代码域之间有什么区别? 我应该在哪种情况下使用?

    2 回复  |  直到 15 年前
        1
  •  25
  •   Marc Gravell    15 年前

    表达式树与 AST . 它不直接映射到代码,但非常适合从算法构造。例如,如果要分析公式:

    ((a + 2) / b)
    

    即:

    ParameterExpression a = ..., b = ...
    var body = Expression.Divide(
        Expression.Add(a, Expression.Constant(2)),
        b);
    var lambda = Expression.Lambda(body,a,b); // optionally with generics
    

    事实上,我已经做到了 确切地 这将使用一个构建对象树的解析器,对象通过“访问者”实现生成完整的表达式。在.NET 4.0中,更丰富的表达式树支持可以支持大多数场景,并根据需要进行编译。

    表达式的另一个关键用途是 解构 它们在运行时,所以 在您的代码中 你可能有:

    Foo(x => x.SomeMethod(1, "abc"));
    

    并提取 SomeMethod 方法信息, 1 "abc" 等。


    代码DOM映射到 代码 . 一切都是关于陈述等, 非常 类似于如何编写常规代码。作为工具的一部分,codedom最常用于代码生成。你 可以 使用它进行动态编译,但老实说,这很难。我不是粉丝。好的特性是一个codedom树 可以 为多种语言工作。


    另一个竞争者应该是 DynamicMethod 和/或 ILGenerator . 这个 映射到ast(表达式),不能用于生成源代码(codedom),但允许完全访问msil工具。当然,它也要求你用堆栈等来思考,但是它是 非常 有效的元编程。


    如果 生成器 太硬了,codedom是pita,另一个选项是运行时生成代码 作为字符串 . 然后把那个传过去 CSharpCodeProvider 编译它。核心运行时的某些部分可以做到这一点( XmlSerializer IIRC)。


    因此,总结一下:

    • 元编程: 生成器 CSharpcodeProvider(CSharpcodeProvider) Expression 在4.0中(但这在3.5中相当有限)
    • 处理AST: 表情
    • 运行时分析: 表情
    • 多语言代码生成:代码dom
        2
  •  0
  •   Jouke van der Maas    15 年前

    表达式树用于构建表达式。在运行时创建源代码。codedom用于编译源代码。在你建造它之前,它必须存在。表达式树更灵活,但更难使用。

    如果要向应用程序添加脚本,请使用codedom。如果你想做非常高级的反射和喜欢,使用表达式树,但我不推荐它。