我想通过Json Object
运行DynamicExpression
,但是出现错误"No method 'SelectToken' exists on type 'System.Linq.Enumerable'."
我正在尝试通过DynamicExpression执行以下规则。
规则:JObject.SelectToken(\"$.Dosage\").ToString()==\"25\"
我的Json对象:
{
"Dosage": 25,
"Drug": "Indocin",
"Patient": "David",
"Date": "2019-05-22T22:06:50.4394817"
}
´Code:
//converted json to Json Object:
JArray jsonArray = JArray.Parse(jsonString);
JObject data = JObject.Parse(jsonArray[0].ToString());
bool r = CompareRules("JObject.SelectToken(\"$.Dosage\").ToString()==\"25\"", data);
public static bool CompareRules(string formula, params object[] objects)
{
var result = false;
try
{
var lstParams = objects.Select(o => Expression.Parameter(o.GetType(), o.GetType().Name)).ToArray<ParameterExpression>();
var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(lstParams, null, formula);
result = (bool)e.Compile().DynamicInvoke(objects.ToArray());
}
catch (TargetInvocationException) { }
catch (KeyNotFoundException) { }
catch (Exception ex) { }
return result;
}
如果值匹配,否则我期望JObject.SelectToken(\"$.Dosage\").ToString()==\"25\"
的输出为true
。
答案 0 :(得分:0)
我认为Dynamic Linq在这里不是正确的选择,因为您不能在不真正滥用其源代码的情况下以想要的方式使用它(即,通过添加仅适用于JToken
的条件) )。原因如下:
您的异常源于Dynamic Linq的ParseAggregate
(如果您调试到Dynamic Linq源代码,就会看到它)。
此方法假定可以将解析后的动态方法(在您的情况下为SelectToken
)解析为IEnumerable
扩展方法(例如Where
)。
但是,SelectToken
不是扩展名IEnumerable
,而是在Newtonsoft.Json.Linq.JToken
中声明的简单实例方法。因此,正如异常所示,它“不适用”。
因此,您也将无法使用给定的in this answer步骤,因为它们仅适用于IEnumerable
扩展方法。
您应该使用标准反射编程。
*请注意,您已经以一种非常规的方式使用ParseLambda
,因为作为最后一个参数传递的表达式不是lambda。