类型“ System.Linq.Enumerable”上不存在方法“ SelectToken”

时间:2019-05-23 08:32:53

标签: c# json.net

我想通过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

1 个答案:

答案 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。