C# C、 用户定义公式

C# C、 用户定义公式,c#,winforms,formula,C#,Winforms,Formula,我需要使用户能够在datagridview中编写自己的公式。类似于Excel中的函数 公式定义示例: 所以,用户在公式单元格中编写自己的公式,然后在另一个表中显示每个公式的结果。如何做到这一点?可以将公式转换为C,并使用SystemCodeCom.Compiler动态编译,您可以在输入变量值的过程中动态运行它。 否则,您将不得不实现某种小型解析器/编译器——这是一项相当特殊的技能,可能会很快变得复杂——特别是如果您的公式变得更复杂,这可能会发生。 有一些关于动态编译的codeproject文

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

公式定义示例:


所以,用户在公式单元格中编写自己的公式,然后在另一个表中显示每个公式的结果。如何做到这一点?

可以将公式转换为C,并使用SystemCodeCom.Compiler动态编译,您可以在输入变量值的过程中动态运行它。 否则,您将不得不实现某种小型解析器/编译器——这是一项相当特殊的技能,可能会很快变得复杂——特别是如果您的公式变得更复杂,这可能会发生。
有一些关于动态编译的codeproject文章。但是网络上还有很多其他的例子。

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

如果它们像看上去一样简单,那么某种表达式生成器,选择两个命名值和一个运算符可能是一种方法,但是modulerise,既构建表达式,又计算它,以便您可以在以后的某个时候增强

不管它们看起来多么简单,我都会尝试预定义作为元数据从某种后台存储加载的表达式,并让它选择其中一个,而不是用户输入。您可以轻松地在设计的这一方面花费数月的时间,值得吗?

我会试试

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


我在一个项目中最近有一个类似的需求动态解析表达式,最后使用WF Windows工作流基金会的VB表达式。这当然取决于此功能对您的重要性以及您愿意投入多少精力。在我的案例中,它比NCalc更好,原因有几个:

它支持比NCalc更复杂的表达式 可以分析生成的表达式树以确定各个表达式的依赖关系 对于表达式,它的语言与WF中的语言相同,我已经在项目的其他地方使用了WF 无论如何,我已经写过这个主题。

几年前我创建了这个主题。它已经开源了一段时间,但我终于找到了方向,最近发布了v2.02和添加的文档。它正在积极维护。它有两个很好的特性:

循环参考检测 源变量直接来自外部对象 表达式的反向生成 妥善记录
还没有,因为我不知道怎么做。如果你不想要一个可以解析和计算简单公式的解析器,那么你应该看看NCalc:Tnx!我将尝试使用动态编译。在我看来,在web上的一般示例中进行的动态编译是相当糟糕的,因为每个新编译的项目都会添加到应用程序域中,并且无法再卸载。更好的方法可以创建自己的应用程序域,但在与动态编译代码通信时会产生大量开销。对于公式,我使用了一个公式解析器,比如…@UweKeim Hm,它看起来很不错-可能值得单独回答!我查看了所有的解决方案,目前NCals可能是解决我问题的最简单的解决方案。谢谢大家的帮助。
Dictionary<string, int> dict = new Dictionary<string, int>() { { "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();