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

标签 c# vb.net expression

最好的方法是评估如下表达式:
(A 和 B)或(A 和 C)或(不是 B 和 C)
或者
(A && B) || (A && C) || (!B && C)

在运行时,我计划将上述表达式转换为以下内容:
(对与错)或(对与错)或(不对与错)
或者
(真&&假)|| (真&&假)|| (! 假 && 真)

条件: 1) 直到运行时才知道逻辑表达式。 2) number 变量和它们的值直到运行时才知道。 3) 变量值永远不会为空。

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

建议?

谢谢。

最佳答案

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

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

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

关于c# - C# 或 VB 中的动态逻辑表达式解析/评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/350181/

相关文章:

c# - 是否可以编写 Skype 客户端?

c# - 组合多个 Where's 时如何格式化 linq 以用 OR 替换 AND

c# - 断言动态集合中两个不同的对象是否具有相同的值

mysql - 从mysql中与日期对应的特定列中提取固定值

c# - 使用字符串表达式 c# 将列表转换为字典

c# - 将类的复杂数据源绑定(bind)到 GridView

vb.net - 从 TextBox 继承的 vb .NET 自定义控件不会触发 Paint 事件

vb.net - ListView 中的详细信息属性不显示

C# 我在寻找用于运行时属性替换的 Lambda/Expression/Func/Reflection 的什么构造?

php - 在 .htaccess 中重写规则 - 波斯语的正则表达式