评估用户输入的比较字符串与对象的最佳方法是什么?

时间:2017-09-20 20:36:45

标签: c# reflection

如果我有一个用户提供一个字符串,如

eval= "productId = '100' and (GUID = '100' or (GUID = '200' and productId = '100' ) )"

使用字符串查看内存中的对象是否满足这些约束的最佳方法是什么?例如,以下模型将评估为真:

evaluate(eval, new Product{productId ='100', GUID='100'})

有人让我朝着可以实现这个目标的设计模式的方向发展吗?

1 个答案:

答案 0 :(得分:1)

使用NCalc和反射, Evaluate 方法可以写成:

public object Evaluate(string exprString, object o)
{
    var dict = o.GetType().GetProperties().ToDictionary(p => p.Name, p => p);

    var expr = new NCalc.Expression(exprString);
    expr.EvaluateParameter += (name, e) =>
    {
        e.Result = dict[name].GetValue(o, null);
    };

    return expr.Evaluate();

}
var res = Evaluate(
             "productId = '100' and (GUID = '100' or (GUID = '200' and productId = '100' ) )", 
             new { productId = "100", GUID = "100" });

OR

var res2 = Evaluate("x + 100 + y", new { x = 10, y = 1 });

PS:为简单起见,忽略给定对象的错误检查+“公共字段”