5

我的 .NET 应用程序在运行时评估用户定义的规则。这些规则由用户通过 GUI 菜单输入到系统中。我生成一个与之对应的逻辑语句并将其存储在数据库中。

例如:(姓名 = 'John' AND Surname = 'Smith') OR Number > 12

但是,当用户想通过 GUI 编辑规则时,我需要进行反向操作,从存储的规则中确定菜单状态,这既昂贵又复杂。您如何建议以可以轻松反转为菜单状态的方式存储规则?

4

1 回答 1

5

您可以将规则存储为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。

你说你已经实施了评估,所以我会省略这个。你也可以看看这个问题

于 2011-07-04T10:10:04.680 回答