代码之家  ›  专栏  ›  技术社区  ›  scope_creep

实现不在表达式树中,.NET 4

  •  4
  • scope_creep  · 技术社区  · 15 年前

    是否可以执行!(不是)使用表达式树。我对创建一个C eval类很感兴趣,该类将解析和评估包含true、false、、&&and的逻辑表达式!.I知道.NET 4表达式树目前支持&&和,但我想知道它们是否是实现类Summat的一种方法!(x&y)z,其中z=假,y=真,z=假。

    目前,我正在使用一个标准的基于堆栈的标记器、解析器、评估器来评估这些类型的表达式,但是如果可以动态地创建和执行一个合适的表达式树,我会随意地转储它。

    3 回复  |  直到 13 年前
        1
  •  10
  •   Jon Skeet    15 年前

    我通常会发现,编写一个lambda表达式是值得的,它可以满足我的需要,然后看看C编译器对它做了什么。

    所以这个代码:

    Expression<Func<bool,bool>> func = x => !x;
    

    编译为:

    ParameterExpression expression2;
    Expression<Func<bool, bool>> expression = 
           Expression.Lambda<Func<bool, bool>>(Expression.Not(
                expression2 = Expression.Parameter(typeof(bool), "x")), 
                    new ParameterExpression[] { expression2 });
    

    (为格式化道歉-很难知道该怎么做。)

    这是使用Reflector反编译的,但是它的“优化”设置为.NET 2.0以避免使用lambda语法。

    一旦你越过了垃圾,你就会发现它正在使用 Expression.Not . 及使用 Expression.AndAlso 和用途 Expression.OrElse .

        2
  •  2
  •   Travis Gockel    15 年前

    这个已经存在于 System.Linq.Expressions . 见 UnaryExpression . 除非有什么你不喜欢的表达方式,我建议你使用它们。还有一些方法可以从源代码创建抽象语法树,特别是在 Microsoft.Scripting.Ast (在dlr:microsoft.scripting中找到)。