ルールを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、データベースの可読性を気にしない場合はバイナリ)を使用して、そのようなツリーを保存できます。デシリアライズでは、解析を行う必要はなく、ツリーをトラバースしてメニューにデータを入力できます。
"(Name ='John' AND Surname ='Smith')OR Number> 12"の印刷は、ASTがある場合にも簡単です-BinaryExpressionの場合:左に印刷、演算子を印刷、右に印刷。
あなたはすでに評価を実施していると言っているので、これは省略します。この質問もご覧ください。