gpt4 book ai didi

.net - 规则引擎 - 如何存储规则以避免在编辑时解析?

转载 作者:行者123 更新时间:2023-12-04 19:18:33 26 4
gpt4 key购买 nike

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

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

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

最佳答案

您可以将规则存储为 AST s - 实现一些代表树节点的类:

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 时,打印 "(Name = 'John' AND Surname = 'Smith') OR Number > 12"也很容易 - 对于 BinaryExpression:打印左,打印运算符,打印右。

你说你已经实现了评估,所以我会忽略这个。你也可以看看 this question .

关于.net - 规则引擎 - 如何存储规则以避免在编辑时解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6444845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com