是否可以实现一个 ! (不)使用表达式树。我有兴趣创建一个 C# eval 类,该类将解析和评估包含 true、false、||、&& 和 ! 的逻辑表达式。我知道 && 和 || .NET 4 表达式树目前支持,但我想知道它们是否是一种实现 summat 的方法,如 !(x && y) || z 其中 z=false、y=true 和 z=false。
目前我正在使用基于标准堆栈的标记器、解析器、评估器来评估这些类型的表达式,但如果可以创建并即时执行合适的表达式树,我会很乐意将其转储。
最佳答案
我通常发现值得编写一个 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
.
关于.net-3.5 - 在表达式树中实现 Not,.net 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2165048/