是否可以实施! (不)使用表达式树。我有兴趣创建一个C#eval类,它将解析和评估包含true,false,||和&&amp ;;的逻辑表达式。而且!我知道&&和||目前.NET 4表达式树支持,但我想知道它们是否是一种实现summat的方法!(x&& y)|| z其中z = false,y = true,z = false。
目前我正在使用基于标准堆栈的标记化器,解析器,求值程序来评估这些类型的表达式,但如果可以动态创建和执行合适的表达式树,则会很乐意将其转储。
答案 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)