问题 使用C#解析并执行公式


我正在寻找一个开源库来解析和执行C#中的公式/函数。

我想创建一组从接口派生的对象(即IFormulaEntity),它具有属性/方法/值,并允许用户为这些对象指定公式。

例如,我可能有

public class Employee : IForumulaEntity
{ 
      public double Salary { get; set; }
      public void SendMessage(string message)
}

然后允许应用程序用户写一些类似的东西;

Employee person = <get from datasource>
if (person.Salary > 1000)
    person.Salary += 1000;

person.SendMessage("Hello");

这“看起来像C#”,但它将是一种简化的编程语言。我知道这很有问题。我希望我的用户能够合理地使用(即可以编写自己的Excel公式)。


2348
2018-06-19 09:18


起源

(为什么我在主页上看到这个问题** **删除我的账户?) - Karel Bílek
拥有超过5000个声望和2个金徽章,你应该知道比尝试清除你的问题内容更好。您是否知道可以将其标记为主持人注意?只是说你想要删除你的帐户。他们会照顾你剩下的休息时间。只是使用该消息进行编辑不会让主持人注意到您。 - BoltClock♦


答案:


查看属于Windows Workflow Foundation的规则引擎功能。

这不是一个人们会想到的地方。但是,作为他们为生成允许Workflow开发人员使用可配置规则和表达式的UI所做的工作的一部分,他们已经想出了一种在自己的应用程序中执行相同操作的方法,即使您没有使用Workflow也是如此一点都不他们的文档包括在Windows窗体应用程序中托管此功能的示例。


6
2018-06-19 10:20



+1。是的,这正是我正在寻找的东西[msdn.microsoft.com/en-us/library/aa480193.aspx] 除了我想允许我的用户编写规则。 - Dead account
这就是我的意思 - 它 不允许用户编写规则。您可以在自己的应用程序中托管规则设计器,用户可以编写规则。然后,您可以在运行时对数据应用用户编写的规则定义。 - John Saunders
像往常一样,Microsoft提供了这些工具。这就是我爱他们的原因:) - anonymous coward
使用V3要非常小心,因为V4几乎是一个重写*(听听最近的Brian Noyes DNR的好消息)。如果要找一本书,Essential WF书很不错,但是基于V3。 - Ruben Bartelink
没错,但您是否知道规则引擎的变化程度如何? - John Saunders


我使用过ANTLR,FSLEX / FSYACC和Managed Babel。所有人都按照你的要求行事,虽然所有人都是免费的,但只有第一个是开源的。

ANTLR: http://antlr.org/

FSLEX: http://www.strangelights.com/fsharp/wiki/default.aspx/FSharpWiki/fslex.html

托管巴别塔: http://msdn.microsoft.com/en-us/library/bb165963.aspx


6
2018-06-19 09:26



+1谢谢。我现在正在看这些。 - Dead account


你可以用 CS-脚本。这允许你执行c#代码,这可能是你想要的更多,但为什么不坚持使用c#而不是创建自己的类似c#的语法。可以将cs-script作为DLL集成到应用程序中,并且可以允许它执行不属于类的c#代码,以便用户可以只编写他们需要的几个语句。


2
2017-07-24 10:10





春天的表达 是非常强大的,而不是像WF

(该引擎基于ANTLR,表达式位,虽然它引入了一个相当大的lib,但并没有在所有Spring.NET中拉动)


0
2017-07-24 09:51



是的,我为自己答案的及时性感到自豪! - Ruben Bartelink
啊!潜行者!我最后自己动手,因为要求是合理的。见www.twipler.com/experiment - Dead account
收费有罪!是的,距离WF还有很长的路要走! - Ruben Bartelink


虽然我打败了这个, 动态LINQ 在这个空间中播放(特别是C#之类的语法)。显然要小心,在您的上下文中支持它的要求(代码的发布/编译)。


0
2017-07-24 09:57