C#,用户定义的公式

我需要让用户能够在datagridview中编写自己的公式。 类似Excel中的函数。

公式定义示例:

x http://sofzh.miximages.com/c%23/6e2004.jpg

因此,用户在公式单元格中编写自己的公式,然后在其他表格中显示每个公式的结果。 我怎么能这样做?

我会尝试NCalc

NCalc是.NET中的数学表达式计算器。 NCalc可以解析任何表达式并评估结果,包括静态或动态参数和自定义函数。

Dictionary dict = new Dictionary() { { "Income", 1000 }, { "Tax", 5 } }; string expressionString = "Income * Tax"; NCalc.Expression expr = new NCalc.Expression(expressionString); expr.EvaluateParameter += (name, args) => { args.Result = dict[name]; }; int result = (int)expr.Evaluate(); 

您的公式可以被操作为C#并使用SystemCodeCom.Compiler动态编译,您可以动态地运行它来输入您的变量值。
否则你将不得不使用某种迷你解析器/编译器 – 这是一种相当特殊的技能,并且可能很快变得复杂 – 特别是如果你的公式变得更复杂(可能可能)。
这里和这里有关于动态complilation的代码项目文章。 但网上还有很多其他的例子。

有许多方法可以做到这一点,它们都围绕将公式转换为可执行代码。 你想编写自己的解析器,还是想使用现有的解析器? C#本身,IronPython,IronRuby,一些现成的组件。 如果你使用完整的解析器,你可能想看看如何限制用户可以用它做什么,无意或其他…

如果它们看起来很简单,那么某种表达式构建器(选择两个命名值和一个运算符)可能是最好的方法,但是模块化,既可以构建表达式,也可以对它进行评估,这样你就可以在以后加强。

然而,考虑到它们看起来有多么简单,我会想要预定义表达式(从某种支持商店加载为元数据,并使其选择其中一个而不是用户输入它。你可能很容易花费几个月的时间设计方面,值得吗?

我最近在一个正在处理的项目中有一个类似的要求(动态解析表达式),最后使用了WF(Windows Workflow Foundation)的VB表达式。 这当然取决于此function对您的重要程度以及您愿意投入多少精力。 在我看来,由于以下几个原因,它比NCalc更好:

  • 它支持比NCalc更复杂的表达式
  • 可以分析生成的表达式树以确定各个表达式的依赖性
  • 表达式与WF中的语言相同(我已经在项目的其他地方使用过)

无论如何, 这是一篇关于这个主题的短篇博客文章。

几年前我创建了信天翁表达式解析器 。 它已经开源了一段时间,但我终于绕过并发布了v2.02并最近添加了文档。 它正在积极维护。 它有几个不错的function:

  • 循环参考检测
  • 来自外部对象的源变量
  • 反转生成表达式
  • 正确记录