You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:15:32