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

.NET 6配置绑定dynamic对象返回null的问题排查

.NET 6配置绑定返回null的问题排查

问题场景

appsettings.json配置内容:

{
  "QueryConfigList": [
    {
      "TableName": "Live",
      "QueryText": "SELECT * FROM Live",
      "AdditionalInfo": "Users only",
      "ObjectClass": {
        "TagName": "string",
        "Value1": "float"
      }
    },
    {
      "TableName": "Orders",
      "QueryText": "SELECT * FROM Orders",
      "AdditionalInfo": "Completed orders",
      "ObjectClass": {
        "TagName": "string",
        "Value2": "string"
      }
    }
  ]
}

对应的C#类定义:

public class QueryConfig
{
    public string? TableName { get; set; }
    public string? QueryText { get; set; }
    public string? AdditionalInfo { get; set; }
    public dynamic? ObjectClass { get; set; }
}

public class QueryConfigList
{
    public ICollection<QueryConfig>? QueryConfig { get; set; }
}

在Startup.cs中执行绑定代码后返回null:

var queryConfigList = builder.Configuration.GetSection("QueryConfigList").Get<List<QueryConfig>>();

问题原因

核心问题在于**dynamic类型无法被.NET配置绑定系统正确反序列化**。配置绑定依赖明确的类型元数据映射配置节点,而dynamic没有固定的类型结构,绑定器无法确定如何将JSON对象转换为dynamic实例,最终导致整个绑定失败返回null。

你定义的QueryConfigList类并未实际使用,但这不是返回null的直接原因。

解决方法

将QueryConfig类中的dynamic? ObjectClass替换为Dictionary<string, object>? ObjectClass(或ExpandoObject? ObjectClass),让绑定器可以将JSON键值对映射为明确的结构:

修改后的类定义:

public class QueryConfig
{
    public string? TableName { get; set; }
    public string? QueryText { get; set; }
    public string? AdditionalInfo { get; set; }
    public Dictionary<string, object>? ObjectClass { get; set; }
}

重新执行绑定代码后,就能正确获取QueryConfigList中的配置项。如果需要更灵活的动态访问,也可以使用ExpandoObject,用法与字典类似,但支持通过属性语法访问键值。

内容的提问来源于stack exchange,提问作者Roman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:52:39