.net-3.5 - 在表达式树中实现 Not,.net 4

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

是否可以实现一个 ! (不)使用表达式树。我有兴趣创建一个 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/

相关文章:

c# - 使用 BinaryExpression AND 解析表达式树

c# - 如何将对象转换为 Type 类描述的类型?

c# - 使用 .netcf-3.5 在 CE5 中打开 .exe 的 Process.Start()。 Win32异常

.net - 来自 .NET 程序的 IMS 数据库

.net - C#在字符串中添加一个字符

c# - MemberBinding LINQ 表达式有哪些示例?

c# - 如何查看网络连接是否更改状态?

c# - 有关如何在 c# 中为 Windows 7 任务栏编码所需的信息

.net - 重置保留 key 的 .NET 字典

C# 如何将 Expression<Func<SomeType>> 转换为 Expression<Func<OtherType>>