【问题标题】:Need a formula interpreter for .Net [closed]需要.Net的公式解释器[关闭]
【发布时间】:2011-03-29 21:59:49
【问题描述】:

我正在寻找可以在 C# 应用程序中使用的公式解释器。它需要能够解释这样的字符串:

max(1+2, 4) * x

我发现Writing a fast formula interpreter (codeproject.com) 几乎可以满足我的需要,但它不允许具有多个参数的函数。我可能可以向它添加该功能,但我只是想知道这样的东西是否已经存在。

谢谢

【问题讨论】:

标签: c# .net expression interpreter formula


【解决方案1】:

我过去用过的一对没有问题:

【讨论】:

    【解决方案2】:

    您实际上可以通过将某些功能关键字(例如max)解析并替换为Math.Max,然后将dynamically building and executing 公式作为C# 类和方法来构建一个非常有效的解释器。所以实际上你会解析和包装公式,并允许 C# 编译器解释和执行它。

    因此,采用 max(1+2, 4) * x 的示例公式将变成:

    public class MyFormula
    {
        public double calc(double x)
        {
            return Math.Max(1+2, 4) * x;
        }
    }
    

    您可以即时编译,然后根据链接的文章执行。当然,您仍然需要解析并传递 x 值。

    【讨论】:

    • 如果不满足某些安全预防措施,这似乎很危险。
    • @Ozzah:这不像 SQL 注入。一方面,您将限制输入量,然后您将解析数学术语,例如 max、sin、cos 等。任何不符合 kosher 的内容都会作为语法错误而失败。
    【解决方案3】:

    很久以前,在一个项目中,我必须使用公式创建一些预订,我使用了 VsaEngine。要使用此引擎,您需要添加对Microsoft.JScript 的引用。这是一个例子:

    使用代码很简单,只需替换公式参数如:

    string formula = "x+y";
    formula=  formula.Replace("x","100").Replace("y","200");
    string result = CalculateFormula(formula);
    

    这里是核心方法,CalculateFormula:

    public string CalculateFormula(string evaluationString)
    { 
          VsaEngine en = VsaEngine.CreateEngine();
          Object result = Eval.JScriptEvaluate(evaluationString, en);
          return result.ToString();
    }
    

    有了它,您可以创建您的自定义公式解释器引擎。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2021-04-19
      相关资源
      最近更新 更多