【问题标题】:How can I load an empty object into a dictionary from appsettings.json?如何从 appsettings.json 将空对象加载到字典中?
【发布时间】:2022-04-08 07:29:34
【问题描述】:

我正在尝试在 C#/.net6 中的应用启动时将值加载到自定义选项类中。来自appsettings.json 的一些输入没有按我的意愿加载。

我的选项类如下所示:

    public class CustomOptions
    {
        
        public Dictionary<string, CustomInfo> MyOptions { get; set; }
        
    }

    public class CustomInfo
    {

        public Dictionary<string, string> DictionaryField { get; set; } = new Dictionary<string, string>();

        public List<string> ListField { get; set; } = new List<string>();
    }

appsettings.json 包含以下内容:

"CustomOptions" : {
    "MyOptions": {
      "OptionOne": {},
      "OptionTwo": {
        "DictionaryField": {
          "ValueOne": "somevalue",
          "ValueTwo": "someothervalue"
        },
        "ListField": [
          "ListItem"
        ]
      }
    }
  }

并在 Program.cs 中加载选项

builder.Services.AddOptions<EndpointOptions>().Bind(builder.Configuration.GetSection(EndpointOptions.Key));

目前,OptionTwo 已正确加载并设置了所有字段,但 OptionOne 甚至没有出现在注入的IOptions&lt;TOptions&gt; 服务中。

我希望将 OptionOne 加载到带有默认 CustomInfo 对象或空值的 MyOptions 字典中。这可能吗?

编辑:我需要能够在某些时候添加除 OptionOne 和 OptionTwo 之外的更多选项,理想情况下可以通过 appsettings.json 来做到这一点,因此需要 @ 中的字典987654330@上课。所有这些选项仍将遵循 CustomInfo 类。

【问题讨论】:

    标签: c# .net-core configuration .net-6.0


    【解决方案1】:

    JsonConfigurationFileParser 忽略任何空对象,只需添加 null 的值作为配置值,即被忽略 during binding

    如果您确实需要将这两个选项都添加到字典中,您可以将至少一个属性添加到 OptionOne 部分:

    "OptionOne": {
      "DictionaryField": {}
    }
    

    坦率地说,就低内存分配而言,不创建CustomInfo 的空实例是有意义的,而是使用字典上的TryGetValue 方法来测试该值是否存在。

    【讨论】:

      猜你喜欢
      • 2019-09-21
      • 2012-11-21
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      相关资源
      最近更新 更多