如何在JObject的Expression.Property中设置类型

时间:2016-02-11 13:26:46

标签: c# linq lambda json.net expression-trees

我正在尝试生成表达式树。我有JSON数据,我已进入JOject 这就是我firstRecord的样子: -

{
  "Name": "JOHN",
  "Code": "112631.1"

}

代码: -

   var reportArr = (JArray)(data["reportData"]);
   var firstRecord=reportArr.FirstOrDefault();//sample data given above
   Type classType = firstRecord.GetType();// Type is Of JObejct.
   ParameterExpression parameter = Expression.Parameter(classType, "lambdaKey");
   var fun = Expression.GetFuncType(classType, typeof(object));
   var menuProperty = Expression.Property(parameter, "Name");//Throwing error

错误消息是: -

 Instance property 'Name' is not defined for type 'Newtonsoft.Json.Linq.JObject'

如何使用JOject从Expression.Property获取MemberExpression。

1 个答案:

答案 0 :(得分:1)

JObject是动态类型,不提供常规类型等类型属性。

与表达式一样,您可以从编写编译时表达式开始:

Expression<Func<JObject, object>> expr = item => ((JValue)item.Property("Name").Value).Value;

使用调试器Locals / Watch窗口检查内部的内容。

在这种情况下,它会是这样的

var item = Expression.Parameter(typeof(JObject), "item");
var body = Expression.Property(
    Expression.Convert(
        Expression.Property(
            Expression.Call(item, "Property", null, Expression.Constant("Name"))
            , "Value")
        , typeof(JValue))
    , "Value");
var expr = Expression.Lambda<Func<JObject, object>>(body, item);