C# 表达式评估设计问题

C# 表达式评估设计问题,c#,oop,C#,Oop,我创建了一个用于计算表达式的建模系统。现在,这些表达式中的操作数可以是几种类型之一,包括一些基本的.NET类型。定义表达式类时,我需要某种程度的类型安全性,因此不希望对操作数对象类型使用“object”,因此我考虑定义一个抽象操作数基类,其中不包含任何内容,并为每种类型的操作数创建一个子类。你觉得这个怎么样 此外,只有某些类型的操作数对其他操作数有意义。最后,只有一些运算符对特定操作数有意义。我真的想不出在编译时实现这些规则的方法,所以我想我必须在运行时进行这些检查 我不确定基于C的语言是否有这

我创建了一个用于计算表达式的建模系统。现在,这些表达式中的操作数可以是几种类型之一,包括一些基本的.NET类型。定义表达式类时,我需要某种程度的类型安全性,因此不希望对操作数对象类型使用“object”,因此我考虑定义一个抽象操作数基类,其中不包含任何内容,并为每种类型的操作数创建一个子类。你觉得这个怎么样

此外,只有某些类型的操作数对其他操作数有意义。最后,只有一些运算符对特定操作数有意义。我真的想不出在编译时实现这些规则的方法,所以我想我必须在运行时进行这些检查


我不确定基于C的语言是否有这样的功能,但是Java有几个软件包,这些软件包对这一点很有意义

JavaCC或java编译器允许您定义一种语言(例如表达式),并构建相应的java类。DemeterJ是一个用户友好的软件包,虽然不是实验性的和学术性的软件包,但它可以让您非常轻松地指定表达式语言,并附带一个库,用于定义访问者和在生成的类结构上操作的策略。如果你能负担得起改用Java的费用,我可以试试。另一方面,我会寻找这些技术的克隆

<> P>另一个要考虑的问题是,如果您在最终结果的合理近似下生成了类结构,则可以对所有生成的类进行子类化,并将所有特定于应用程序的登录都建立到子类中。这样,如果您真的需要为表达式语言重新生成一个新模型,那么您的逻辑将相对独立于类层次结构

更新:事实上,有些东西似乎已经移植到了.NET技术上,尽管我还没有使用过它,所以我不确定它可能是什么形状:


祝你好运

我最近构建了一个动态表达式计算器。我发现有效的方法是,按照您的建议,创建一个具有有意义的派生类(NumericOperand、StringOperand、DateOperand等)的BaseOperand。根据您的实现,泛型也可能有意义(Operand)

通过访问者模式的实现,您可以执行任何类型的验证


我有一个非常具体的需求来推出我自己的解决方案,但是已经有许多选项可用于处理表达式。您可能想看看其中的一些,以获得灵感或避免重新发明轮子。

3.5中的
表达式如何?我最近用它编写了一个表达式解析器/编译器。

我发现了一种使用ExpressionAsis框架处理对象类型的好方法。他们使用自定义数据结构来携带对象的类型。因此,在使用正则表达式和给定表达式解析操作数之后,它们决定类型并将此类型存储为泛型类的属性,该泛型类可随时用于获取类型


我将沿着这条路径(表达式树)走下去。表达式可以在LINQ中非常干净地编写,并自动转换为表达式树,可以对其求值。仍在努力解决更多的实现细节,但一些PoC编码看起来很有希望!让我知道如果你卡住了-我有一些工作代码的地方,我用在原型(链接)的数学处理-P