繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM