如何无需使用for循环从appsettings的对象数组中读取指定键的值
解决方案
你现在的配置里contractInfo是数组结构,每个元素为单键值对对象,默认没法直接用合约名直接取值,以下是两种可行实现方案:
方案1:优化配置结构(推荐,无需额外处理)
直接把contractInfo从数组改为对象结构,本身就是键值对存储,完全匹配你的业务场景,不需要任何循环就能直接读取:
修改后的appsettings.json
{ "AppSettings": { "contractInfo": { "contract1": "01/11/2020", "contract2": "29/07/2021", "contract3": "15/10/2021", "contract4": "15/02/2021" } } }
新增读取方法(在ConfigHelper中添加即可)
public string GetContractExpireDate(string contractName) { var value = _configuration[$"AppSettings:contractInfo:{contractName}"]; return string.IsNullOrEmpty(value) ? string.Empty : value; }
调用时直接传合约名即可,比如GetContractExpireDate("contract3")就能直接拿到对应日期。
方案2:不修改现有配置结构,预加载到字典
如果不能改动现有appsettings.json的结构,可以在程序启动初始化ConfigHelper时,一次性把所有合约配置加载到字典中,后续读取不需要循环:
修改后的ConfigHelper代码
private readonly IConfiguration _configuration; // 存储合约名和到期日期的映射字典 private readonly Dictionary<string, string> _contractExpireMap; public ConfigHelper(IConfiguration configuration) { _configuration = configuration; // 初始化时一次性加载所有合约配置,只执行一次 _contractExpireMap = _configuration.GetSection("AppSettings:contractInfo") .GetChildren() // 展开每个数组元素的单键值对 .SelectMany(item => item.GetChildren()) .ToDictionary(kv => kv.Key, kv => kv.Value); } public string GetConfigValue(string key) { var value = _configuration["AppSettings:" + key]; return !string.IsNullOrEmpty(value) ? Convert.ToString(value) : string.Empty; } // 新增合约日期读取方法 public string GetContractExpireDate(string contractName) { return _contractExpireMap.TryGetValue(contractName, out var expireDate) ? expireDate : string.Empty; }
后续直接调用GetContractExpireDate传合约名即可,不需要每次遍历数组。
内容的提问来源于stack exchange,提问作者rissa
相关产品推荐
相关产品推荐

