![](/img/trans.png)
[英]No generic method 'Sum' on type 'System.Linq.Enumerable' is compatible
[英]No method 'SelectToken' exists on type 'System.Linq.Enumerable'
我想通过DynamicExpression
运行Json Object
,但出现错误"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"
}
码:
//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
。
我认为Dynamic Linq在这里不是正确的选择,因为您不能在不真正滥用其源代码的情况下(即通过添加仅适用于JToken
条件)以JToken
的方式使用它。 原因如下:
您的异常源于Dynamic Linq的ParseAggregate
(如果您调试到Dynamic Linq源代码,就会看到它)。
此方法假定可以将解析后的动态方法(在您的情况下为SelectToken
)解析为IEnumerable
扩展方法(例如Where
)。
但是, SelectToken
不是IEnumerable
扩展方法,而是在Newtonsoft.Json.Linq.JToken
声明的简单实例方法。 因此,如异常所示,它“不适用”。
因此,您也将无法使用此答案中给出的步骤,因为它们仅适用于IEnumerable
扩展方法。
您应该使用标准反射编程。
*请注意,您已经以一种非常规的方式使用ParseLambda
,因为作为最后一个参数传递的表达式不是lambda。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.