.NET 7 C#中使用Options模式绑定对象数组遇空值问题求解
问题根源
你的配置结构与Options类的结构不匹配:appsettings.json中的AdminEmails直接是一个数组,但AdminEmailsOptions类是一个包含AdminEmails数组属性的对象,配置绑定框架无法将数组直接映射到包含数组属性的对象上,导致_adminEmailsOptions为空。
解决方案
方案一:调整配置文件结构,匹配Options类
修改appsettings.json,将数组包裹在与Options类对应的节点下:
{ "AdminEmailsOptions": { "AdminEmails": [ { "Name": "John", "Email": "john@gmail" }, { "Name": "Daniel", "Email": "daniel@gmail.com" } ] } }
更新Program.cs中的注册代码,指向新的配置节点:
builder.Services.Configure<AdminEmailsOptions>(builder.Configuration.GetSection("AdminEmailsOptions"));
此时配置节点结构与AdminEmailsOptions类完全对应,绑定后即可正确获取数组数据。
方案二:直接绑定数组,简化Options结构
如果不想修改配置文件,可以直接将数组绑定到集合类型,无需外层的AdminEmailsOptions类:
- 更新Program.cs的注册代码:
builder.Services.Configure<List<AdminEmail>>(builder.Configuration.GetSection("AdminEmails"));
- 修改HomeController的注入代码:
public class HomeController : Controller { private readonly List<AdminEmail> _adminEmails; public HomeController(IOptions<List<AdminEmail>> adminEmails) { _adminEmails = adminEmails.Value; } }
这样可以直接获取配置中的数组列表,无需额外的外层类。
注意:配置中
john@gmail缺少.com后缀,虽不影响配置绑定,但可能导致后续邮件功能异常,建议补充完整。
内容的提问来源于stack exchange,提问作者Simant
相关产品推荐
相关产品推荐

