我的 .NET 应用程序在运行时评估用户定义的规则。这些规则由用户通过 GUI 菜单输入到系统中。我生成一个与之对应的逻辑语句并将其存储在数据库中。
例如:(姓名 = 'John' AND Surname = 'Smith') OR Number > 12
但是,当用户想通过 GUI 编辑规则时,我需要进行反向操作,从存储的规则中确定菜单状态,这既昂贵又复杂。您如何建议以可以轻松反转为菜单状态的方式存储规则?
我的 .NET 应用程序在运行时评估用户定义的规则。这些规则由用户通过 GUI 菜单输入到系统中。我生成一个与之对应的逻辑语句并将其存储在数据库中。
例如:(姓名 = 'John' AND Surname = 'Smith') OR Number > 12
但是,当用户想通过 GUI 编辑规则时,我需要进行反向操作,从存储的规则中确定菜单状态,这既昂贵又复杂。您如何建议以可以轻松反转为菜单状态的方式存储规则?
您可以将规则存储为AST - 实现一些代表树节点的类:
interface INode
{
}
enum BinaryOperator
{
AND, OR, Equal, Greater, Lower;
}
class BinaryExpression : INode
{
BinaryOperator Operator { get; set; }
INode Left { get; set; }
INode Right { get; set; }
}
class PropertyRerefence : INode
{
string PropertyName { get; set; }
}
class Constant : INode
{
string Value { get; set; }
}
您的示例的树如下所示:
BinaryExpression(OR)
Left=BinaryExpression(AND)
Left=...
Right=...
Right=BinaryExpression(Greater)
Left=PropertyReference("Number")
Right=Constant("12")
然后,您可以使用序列化(最好的 JSON 或 XML,如果您不关心数据库中的可读性,甚至可能是二进制)来保存此类树。在反序列化时,您不需要进行任何解析,并且可以遍历树来填充菜单。
当您拥有 AST 时,打印“(姓名 = 'John' AND Surname = 'Smith')OR Number > 12”也很容易 - 对于 BinaryExpression:print Left,print Operator,print Right。
你说你已经实施了评估,所以我会省略这个。你也可以看看这个问题。