为这类事情编写一个非常简单的解释器并不像您想象的那么困难,特别是如果您将公式保持为FunctionName(Parameter, Parameter2 ...)
. 我曾经在一天之内做过类似的事情。您也许可以使用名为 CONCATENATE (à la Excel) 的函数而不是 + 运算符来保持简单。
一种方法是为您要支持的每个功能编写一个简单的语言对象模型,其中包含一个类,例如:
public abstract class ScriptFunction
{
public abstract string Name { get; }
public abstract int ParameterCount { get; }
public abstract object Execute(params object[] parameters);
}
...然后编写一个递归 Eval 函数,检查提供的脚本字符串,使用括号作为分隔符提取函数的名称和参数,查找要调用的 ScriptFunction,然后在其上调用 Execute。
这种方法相对于动态编译的优势在于,您知道代码只能执行您编写的程序来执行的操作,而对于将表达式编译为 C# 代码的操作,您必须小心用户没有对应用程序的其余部分输入灾难性的东西。
有关更高级的方法,请参阅Regex 以匹配函数并捕获它们的参数