使用Option模式时如何通过配置绑定对象的IEnumerable<MyType>属性
问题根源
你的配置绑定失败的核心原因是配置节点名和类属性名不匹配:
JSON配置中MyParentPolicy下的集合节点名称为SomePolicies,但MyParentPolicyOptions类中对应的属性名称为SomePolicySettings,配置绑定器无法匹配到对应节点,因此属性始终为null,和集合类型本身无关。
解决方案
你可以任选以下一种方式解决名称匹配问题:
方案1:修改属性名匹配配置节点
直接调整MyParentPolicyOptions类的属性名,和JSON节点名保持一致:
public class MyParentPolicyOptions { // 属性名和JSON中的SomePolicies节点名完全匹配 public IEnumerable<SomePolicySettings> SomePolicies { get; set; } }
方案2:通过特性指定映射的配置节点名
如果不想修改现有属性名,可以给属性添加[ConfigurationKeyName]特性(.NET Core 3.0及以上版本支持),显式指定绑定的配置节点名:
using Microsoft.Extensions.Configuration; public class MyParentPolicyOptions { [ConfigurationKeyName("SomePolicies")] public IEnumerable<SomePolicySettings> SomePolicySettings { get; set; } }
其他注意事项
- 确认
SomePolicySettings类的属性为公共可读写属性,不能是私有属性、只读属性或者字段 - 老版本.NET框架下如果
IEnumerable<T>绑定异常,可以先换成List<SomePolicySettings>或SomePolicySettings[]测试,绑定逻辑对所有集合类型是通用的 - 你之前尝试字典绑定失败也是同样的名称不匹配问题,修正名称映射后即可正常绑定
内容的提问来源于stack exchange,提问作者sr28
相关产品推荐
相关产品推荐

