将JArray转为IEnumerable时出现“未包含Concat定义”错误的排查
问题原因
你遇到的问题核心在于动态类型(dynamic)的绑定机制:
- 当你用
JsonConvert.DeserializeObject<dynamic>得到json变量后,即便调用ToObject<IEnumerable<string>>(),返回值依然会被当作dynamic类型处理。 - Linq的
Concat是扩展方法,本质是静态类的静态方法。C#的动态绑定只会查找目标类型的实例方法,不会自动识别扩展方法,所以才会抛出“List不包含Concat定义”的异常——因为动态绑定到了Newtonsoft.Json实际返回的List<object>实例,而这个实例本身没有Concat实例方法。
解决方法
方法1:显式转换为强类型
把ToObject的结果强制转换成IEnumerable<string>,让编译器能识别Linq扩展方法:
using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; public class Program { public static void Main() { var json = JsonConvert.DeserializeObject<dynamic>("[\"test1\", \"test2\"]"); // 显式转换为强类型,脱离dynamic绑定 var stringList = (IEnumerable<string>)json.ToObject<IEnumerable<string>>(); var list = stringList.Concat(new[] { "test3" }); Console.WriteLine(string.Join(", ", list)); } }
方法2:直接反序列化为目标类型(更简洁)
既然你最终需要IEnumerable<string>,完全没必要用dynamic,直接反序列化到目标类型即可,代码更简洁且避免动态类型的问题:
using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; public class Program { public static void Main() { // 直接反序列化为IEnumerable<string> var stringList = JsonConvert.DeserializeObject<IEnumerable<string>>("[\"test1\", \"test2\"]"); var list = stringList.Concat(new[] { "test3" }); Console.WriteLine(string.Join(", ", list)); } }
内容的提问来源于stack exchange,提问作者derekantrican
相关产品推荐
相关产品推荐

