【问题标题】:How can I dynamically run a comparison from a string?如何从字符串动态运行比较?
【发布时间】:2013-04-24 16:56:35
【问题描述】:

如果我有一个这样的字符串:

"if (24 == 24) AND ((true == false) OR (true == true)) AND ('HELLO' != 'WORLD')"

如何使用 C#/.Net 在代码中动态评估它?

我们有一个动态的“规则引擎”,用户可以在其中定义规则。所以一个规则可能是

if (@Number == 24) AND ((@SomeVal1 == false) OR (@SomeVal2 == true)) 
  AND ('@CustomerFirstName' != '@CustomerLastName').  

我们想对 @ 变量进行简单的搜索/替换,然后计算字符串。

【问题讨论】:

  • 您在寻找“表达式解析”还是“从字符串运行 C# 代码”?您是在寻找自己编写代码还是为库开放?
  • 希望有一个已经存在的库可以做到这一点。

标签: c# .net dynamic evaluation


【解决方案1】:

将数据视为代码总是会带来一些重大风险,因此请仔细考虑这将对您的应用程序带来哪些安全隐患。

C# 通常不是这样的动态语言,但您可以破解此功能。 Hereeval 的 C# 版本的示例。

@Femaref 指出,根据需要,表达式树也可能是一种选择。

【讨论】:

  • 这段代码完美运行!!谢谢!!并感谢其他人的建议。
【解决方案2】:

你可以,但是这需要很多时间。但是,.net 框架有Expression Trees,可用于生成此类表达式并将它们编译为 lambda。

【讨论】:

    【解决方案3】:

    除了 Femaref 的回答之外,您还可以尝试自己解释字符串。

    这种方式就是某种 DSL(领域特定语言)。您可以在此处阅读有关 DSL 的更多信息:

    ANTLR(用于构建 DSL 的有用工具)http://www.antlr.org/wiki/display/ANTLR3/Antlr+3+CSharp+Target

    【讨论】:

      【解决方案4】:

      恐怕没有简单的方法可以做到这一点。 您可以手动解析字符串,然后使用反射来获取 @foo 语法引用的变量或字段或属性,或者您可以使用反映规则的方法创建动态类型。

      【讨论】:

        【解决方案5】:

        我不确定您的表达方式有多复杂。但这是一个不错的库,我认为它可以处理您的示例表达式。 http://ncalc.codeplex.com/

        【讨论】:

        • 这看起来很适合数学计算,但不适合布尔评估。
        • 布尔评估是一种数学计算。 NCalc 库具有逻辑二元运算符,我们成功地将它用于与您类似的需求。但这都是基本的表达方式,这完全取决于您的要求有多复杂。
        猜你喜欢
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多