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

时间:2010-01-29 20:47:48

标签: .net-3.5 c#-3.0 expression-trees

是否可以实施! (不)使用表达式树。我有兴趣创建一个C#eval类,它将解析和评估包含true,false,||和&&amp ;;的逻辑表达式。而且!我知道&&和||目前.NET 4表达式树支持,但我想知道它们是否是一种实现summat的方法!(x&& y)|| z其中z = false,y = true,z = false。

目前我正在使用基于标准堆栈的标记化器,解析器,求值程序来评估这些类型的表达式,但如果可以动态创建和执行合适的表达式树,则会很乐意将其转储。

3 个答案:

答案 0 :(得分:11)

我经常发现值得编写一个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

答案 1 :(得分:2)

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

答案 2 :(得分:0)