【问题标题】:c# parsing formula in string similar to Excelc#在类似于Excel的字符串中解析公式
【发布时间】:2013-09-21 08:24:27
【问题描述】:

.NET 中是否有方法或库可以制作类似于 Excel 制作的东西?

例如:我有一个对象Invoice 有以下成员 int Year int Number string Customer

和字符串中的“公式” - 例如"right(string(Year), 2) + \"/\" + string(Number, \"000000\""

我想从一个对象和“公式”字符串动态生成一个字符串(类似于 Excel,但当然没有 Excel)

与 NCalc 类似,主要用于数学表达式,但更专注于字符串公式...

【问题讨论】:

  • 要求我们推荐或查找工具、库或最喜欢的非现场资源的问题对于 Stack Overflow 来说是题外话
  • "c# parsing formula in string" "is there a way"... 听起来像是一个关于如何解析形式为 "func(param1,param2,nestedfunc(param1)) 的字符串的算法问题”。提供示例实现库将如何损害问题或答案?加一。

标签: c# .net string


【解决方案1】:

我不久前做过这样的事情。我只是编译表达式运行时。教程可以看这里:A Walkthrough of Dynamically Compiling C# code

【讨论】:

  • 它对 "right(string(Year), 2) + \"/\" + string(Number, \"000000\"" 有什么帮助?
【解决方案2】:

为这类事情编写一个非常简单的解释器并不像您想象的那么困难,尤其是如果您将公式保持为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 for matching Functions and Capturing their Arguments

【讨论】:

    【解决方案3】:

    您可能可以使用面向方面的插件来做到这一点,例如 Post Sharp,它基本上允许运行时代码执行。

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 2016-08-30
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多