如何以编程方式直接从dynamic类型JObject中删除属性,无需先转换为JObject
问题原因
你遇到的报错是因为input声明为dynamic类型时,Properties()方法的调用属于动态调度,编译器无法自动推断Where方法中lambda表达式的委托类型,因此触发编译错误。
解决方案
完全可以不需要额外声明JObject类型变量实现属性删除,因为JsonConvert.DeserializeObject反序列化无强类型约束的JSON时,返回的实际运行时类型本身就是JObject,只需要在调用方法时做一次强转即可,强转操作不会生成新对象,也没有额外性能开销:
public new dynamic input { get; set; } // 初始化 input = JsonConvert.DeserializeObject(jsonInput.ToString()); // 直接强转后删除多余属性,无需额外声明JObject变量 ((JObject)input).Properties() .Where(x => !x.Name.Equals("JsonLookupData")) .ToList() .ForEach(x => x.Remove());
如果不想用强转,也可以提前把过滤逻辑声明为明确的委托类型,避开动态调度的类型推断限制:
Func<JProperty, bool> filterProp = x => !x.Name.Equals("JsonLookupData"); input.Properties().Where(filterProp).ToList().ForEach(x => x.Remove());
内容的提问来源于stack exchange,提问作者cSharp
相关产品推荐
相关产品推荐

