Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要.Net的公式解释器吗_C#_.net_Expression_Interpreter_Formula - Fatal编程技术网

C# 需要.Net的公式解释器吗

C# 需要.Net的公式解释器吗,c#,.net,expression,interpreter,formula,C#,.net,Expression,Interpreter,Formula,我正在寻找一个可以在C#应用程序中使用的公式解释器。它需要能够解释如下字符串: max(1+2, 4) * x 我发现它几乎满足了我的需要,但它不允许有多个参数的函数。我可能会将该功能添加到它中,但我只是想知道这样的功能是否已经存在 谢谢我过去用过的一对,没有问题: 您实际上可以通过解析和替换某些功能性关键字(如max),然后将公式作为C#类和方法来构建一个非常有效的解释器。因此,实际上您将解析和包装公式,并允许C#编译器解释和执行它 因此,取max(1+2,4)*x的样本公式将变成:

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

max(1+2, 4) * x
我发现它几乎满足了我的需要,但它不允许有多个参数的函数。我可能会将该功能添加到它中,但我只是想知道这样的功能是否已经存在


谢谢

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


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

因此,取
max(1+2,4)*x的样本公式将变成:

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

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

很久以前,在一个项目中,我必须使用公式创建一些预订,并且我使用了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();
}

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

可能的重复:另一个可能的重复:这些问题相对来说比较老-Corbins答案已经链接到了两个项目,这两个问题中都没有提到,所以我说保持问题的开放性。这个问题已经做得很死了。在过去的10年里,没有革命性的发展。如果不满足某些安全预防措施,这似乎很危险。@Ozzah:这不像SQL注入。首先,你会限制输入的数量,然后你会解析诸如max、sin、cos等数学术语。任何不符合犹太规范的东西都会因为语法错误而失败。