C# 表达式树:如何检查索引是否存在?

C# 表达式树:如何检查索引是否存在?,c#,C#,我正在编写表达式树来验证Json对象。这里检查stuff[“Address”][“State”]=“NY” var stuff=JObject.Parse(“{‘姓名’:‘乔恩·史密斯’,‘地址’:{‘城市’:‘纽约’,‘州’:‘纽约’,‘年龄’:42}”); ParameterExpression ParameterExpression=Expression.Parameter(typeof(JObject),“g”); var indexexpr=Expression.MakeIndex(p

我正在编写表达式树来验证Json对象。这里检查
stuff[“Address”][“State”]=“NY”

var stuff=JObject.Parse(“{‘姓名’:‘乔恩·史密斯’,‘地址’:{‘城市’:‘纽约’,‘州’:‘纽约’,‘年龄’:42}”);
ParameterExpression ParameterExpression=Expression.Parameter(typeof(JObject),“g”);
var indexexpr=Expression.MakeIndex(parameterExpression,typeof(JObject).GetProperty(“Item”,new[]{typeof(string)}),new[]{Expression.Constant(“Address”)});
var secondlevel=Expression.MakeIndex(indexexpr,typeof(JToken).GetProperty(“Item”,new[]{typeof(string)}),new[]{Expression.Constant(“State”)});
var conversion=Expression.conversion(secondlevel,typeof(string));
var结果=表达式.Equal(转换,表达式.常量(“NY”));
var fun=Expression.Lambda(结果,new[]{parameterExpression}).Compile();
var istrue=乐趣(东西);
问题:对于json对象,有时索引不存在。例如,如果我对同一个对象表达式执行
填充[“Home Address”][“State”]=“NY”
,则会引发异常


问题:在尝试基于索引属性进行评估之前,如何检查索引属性是否存在?

基本上,您需要的是:

(string) (stuff["Address"] != null ? stuff["Address"]["State"] : (JToken) null) == "NY"
可以这样构造:

var stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

ParameterExpression parameterExpression = Expression.Parameter(typeof(JObject), "g");
var indexexpr = Expression.MakeIndex(parameterExpression, typeof(JObject).GetProperty("Item", new[] { typeof(string) }),
            new[] { Expression.Constant("Address2") });                                    
var secondlevel = Expression.MakeIndex(indexexpr, typeof(JToken).GetProperty("Item", new[] { typeof(string) }),
           new[] { Expression.Constant("State") });

// stuff["Address2"] != null
var nullCheck = Expression.NotEqual(indexexpr, Expression.Constant(null, typeof(object)));
// stuff["Address2"] != null ? stuff["Address2"]["State"] : (JToken) null
var finalExpression = Expression.Condition(nullCheck, secondlevel, Expression.Default(typeof(JToken)));
// (string) (stuff["Address2"] != null ? stuff["Address2"]["State"] : (JToken) null)
var conversion = Expression.Convert(finalExpression, typeof(string));
// final expression
var result = Expression.Equal(conversion, Expression.Constant("NY"));

var fun = Expression.Lambda<Func<JObject, bool>>(result, new[] { parameterExpression }).Compile();            
var istrue = fun(stuff);
var stuff=JObject.Parse(“{‘姓名’:‘乔恩·史密斯’,‘地址’:{‘城市’:‘纽约’,‘州’:‘纽约’,‘年龄’:42}”);
ParameterExpression ParameterExpression=Expression.Parameter(typeof(JObject),“g”);
var indexexpr=Expression.MakeIndex(parameterExpression,typeof(JObject).GetProperty(“Item”,new[]{typeof(string)}),
新的[]{Expression.Constant(“Address2”)});
var secondlevel=Expression.MakeIndex(indexexpr,typeof(JToken).GetProperty(“Item”,new[]{typeof(string)}),
新的[]{Expression.Constant(“State”)});
//东西[“地址2”]!=无效的
var nullCheck=Expression.NotEqual(indexexpr,Expression.Constant(null,typeof(object));
//东西[“地址2”]!=无效的stuff[“Address2”][“State”]:(JToken)null
var finalExpression=Expression.Condition(nullCheck,secondlevel,Expression.Default(typeof(JToken));
//(字符串)(stuff[“Address2”]!=null?stuff[“Address2”][“State”]:(JToken)null)
var conversion=Expression.conversion(finalExpression,typeof(string));
//最终表达
var结果=表达式.Equal(转换,表达式.常量(“NY”));
var fun=Expression.Lambda(结果,new[]{parameterExpression}).Compile();
var istrue=乐趣(东西);
var stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

ParameterExpression parameterExpression = Expression.Parameter(typeof(JObject), "g");
var indexexpr = Expression.MakeIndex(parameterExpression, typeof(JObject).GetProperty("Item", new[] { typeof(string) }),
            new[] { Expression.Constant("Address2") });                                    
var secondlevel = Expression.MakeIndex(indexexpr, typeof(JToken).GetProperty("Item", new[] { typeof(string) }),
           new[] { Expression.Constant("State") });

// stuff["Address2"] != null
var nullCheck = Expression.NotEqual(indexexpr, Expression.Constant(null, typeof(object)));
// stuff["Address2"] != null ? stuff["Address2"]["State"] : (JToken) null
var finalExpression = Expression.Condition(nullCheck, secondlevel, Expression.Default(typeof(JToken)));
// (string) (stuff["Address2"] != null ? stuff["Address2"]["State"] : (JToken) null)
var conversion = Expression.Convert(finalExpression, typeof(string));
// final expression
var result = Expression.Equal(conversion, Expression.Constant("NY"));

var fun = Expression.Lambda<Func<JObject, bool>>(result, new[] { parameterExpression }).Compile();            
var istrue = fun(stuff);