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

.NET 7控制台应用如何从appsettings.json读取数组/列表

.NET 7控制台读取appsettings数组失败的解决方法

问题根源

你的代码里有几个关键错误导致数组绑定失败:

  • 类名不匹配:代码中声明的是List<SiteDetails>,但实际定义的实体类是Sites,类型不匹配无法完成绑定
  • Bind方法调用错误:config.GetSection("Sites")已经定位到Sites节点,调用Bind时不需要再传"Sites"参数,错误的参数直接导致绑定失效
  • Settings类属性名不匹配:配置里的IsValid和类里的IsValue名称不一致,虽然你说Settings绑定正常,但这个属性实际无法正确赋值

修正步骤

  1. 统一实体类名称
    把实体类Sites改名为SiteDetail(更符合单个实体的命名规范),或者把代码中的List<SiteDetails>改成List<Sites>。推荐前者:

    public class SiteDetail
    {
        public string site { get; set; }
        public string dateFormat { get; set; }
        public string timeFormat { get; set; }
    }
    
  2. 修正Bind方法调用
    直接对List<SiteDetail>对象进行绑定,不需要额外传递节点名称:

    var siteDetails = new List<SiteDetail>();
    config.GetSection("Sites").Bind(siteDetails);
    

    或者用更简洁的Get<T>()方法,无需提前实例化列表:

    var siteDetails = config.GetSection("Sites").Get<List<SiteDetail>>();
    
  3. 修正Settings类属性名
    把IsValue改成IsValid,和配置文件中的键名保持一致:

    public class Settings
    {
        public string Name { get; set; }
        public bool IsValid { get; set; }
        public int Counter { get; set; }
    }
    
  4. 优化配置获取方式(可选)
    既然已经创建了Host,直接从Host的服务中获取IConfiguration即可,无需重新构建配置:

    public static async Task Main(string[] args)
    {
        using var host = Host.CreateApplicationBuilder(args).Build();
        var config = host.Services.GetRequiredService<IConfiguration>();
    
        var settings = new Settings();
        config.GetSection("Settings").Bind(settings);
    
        var siteDetails = config.GetSection("Sites").Get<List<SiteDetail>>();
        
        // 后续业务代码
    }
    

修正后完整示例

appsettings.json(保持原结构不变)

{
  "Settings":{
    "Name": "test123",
    "IsValid": true,
    "Counter": 123
  },
  "Sites": [
    {
      "site": "US",
      "dateFormat": "MM/dd/yyyy",
      "timeFormat": "HH:mm:ss"
    },
    {
      "site": "IE",
      "dateFormat": "dd/MM/yyyy",
      "timeFormat": "HH:mm:ss"
    }
  ]
}

SiteDetail.cs

public class SiteDetail
{
    public string site { get; set; }
    public string dateFormat { get; set; }
    public string timeFormat { get; set; }
}

Settings.cs

public class Settings
{
    public string Name { get; set; }
    public bool IsValid { get; set; }
    public int Counter { get; set; }
}

Main方法

public static async Task Main(string[] args)
{
    using var host = Host.CreateApplicationBuilder(args).Build();
    var config = host.Services.GetRequiredService<IConfiguration>();

    var settings = new Settings();
    config.GetSection("Settings").Bind(settings);

    // 方式1:Bind绑定
    var siteDetails = new List<SiteDetail>();
    config.GetSection("Sites").Bind(siteDetails);

    // 方式2:Get<T>直接获取(更简洁)
    // var siteDetails = config.GetSection("Sites").Get<List<SiteDetail>>();
    
    // 验证输出
    foreach (var site in siteDetails)
    {
        Console.WriteLine($"Site: {site.site}, DateFormat: {site.dateFormat}");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:24:51