在C#或VB中动态逻辑表达式解析/评估?

Bob*_*tiz 9 c# vb.net expression

最好的是评估如下表达式:
(A和B)或(A和C)或(非B和C)

(A && B)|| (A && C)|| (!B && C)

在运行时,我计划将上面的表达式转换为以下内容:(
真和假)或(真和假)或(非假和真)

(真&&假)|| (真&&假)|| (!False && True)

条件:1)逻辑表达式直到运行时才知道.2)数字变量及其值直到运行时才知道.3)变量值永远不为空.

我知道我可以使用类和方法创建一个简单的汇编,我根据输入在运行时生成,但有更好的方法.我之前做过这个.使用字符串构建器编写代码,然后调用编译器.之后,加载程序集并调用方法.

建议?

谢谢.

Chr*_*ris 8

如果您使用的是.NET3.5,那么您可以使用Expression类解析文本并创建一个抽象的sytax树.然后创建一个合适的LambdaExpression实例并将其编译为委托,然后您可以执行该委托.

为这种相当简单的语法构造一个解析器和语法树构建器是一个非常有趣的练习,并且执行速度比调用编译器要快一些(在我看来它也更简洁).

如果您不使用.NET3.5,那么自己实现解释的抽象语法树也并不复杂.

  • 链接或示例可能很有用. (5认同)
  • 你能举个例子吗? (4认同)

Joe*_*orn 5

请注意:您在谈论的两个最终条件不一定相等。C#中的&&运算符将使用短路评估,而AndVB中的逻辑运算符则不使用短路评估。如果要确保语句相等,请将用户转换为AndAndAlso并将用户转换OrOrElse

对于简单的表达,您可能不会注意到差异。但是,如果条件可能有副作用,或者如果担心两者之间的性能差异,则这可能很重要。