如果我有一个用户提供一个字符串,如
eval= "productId = '100' and (GUID = '100' or (GUID = '200' and productId = '100' ) )"
使用字符串查看内存中的对象是否满足这些约束的最佳方法是什么?例如,以下模型将评估为真:
evaluate(eval, new Product{productId ='100', GUID='100'})
有人让我朝着可以实现这个目标的设计模式的方向发展吗?
答案 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:为简单起见,忽略给定对象的错误检查+“公共字段”