c# - 为什么将属性初始化为 null 而不是配置中的空列表?

标签 c# asp.net-core

我有一个 asp.net-core web api 项目,其配置包含以下定义:

"MyClass": {
   "Value1": 1,
   "Value2": []
}

此配置用于初始化以下类:

public class MyClass
{
    public int Value1 { get; set; }
    public int[] Value2 { get; set; }
}

此类在 Startup.csConfigureServices 方法中使用以下代码从配置中初始化:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();

    services.Configure<MyClass>(Configuration.GetSection("MyClass"));
    services.AddSingleton<AService>();

    services.AddMvc();
}

我的服务构造函数如下所示:

public FeedbackRetrievalService(IOptions<MyClass> myclass)
{
    _myclass = myclass;
}

在构造函数中,我注意到 Value2null,即使它确实在配置中显示为空列表 - 这是我希望该属性的值被初始化。我预计只有当配置中缺少该字段时,该属性才会用 null 初始化。有什么方法可以将字段初始化为空列表吗?

最佳答案

问题是 JSON 配置 loader 和配置 binder 是两个独立的组件。当您加载配置时,配置提供程序会将整个配置文件加载到键/值结构中,其中键是属性路径。在您的示例中,MyClass:Value2:0MyClass:Value2:1 可能是您的 Value2 JSON 数组中两个数组元素的路径。

配置 binder 随后将解释该结构并将其转换为您的类的对象。届时,它将仅具有先前加载的键/值结构中存在的可用信息。

现在,如果您在绑定(bind)之前查看加载的配置,您会注意到空数组不会产生任何结果。如果您考虑路径的工作原理,它是有道理的:MyClass:Value2:0MyClass:Value2:1 分别是索引 0 和 1 的值Value2 数组。但是这对一个空数组如何工作呢?根本没有空数组的条目。

因此,由于空数组没有出现在加载的配置中,绑定(bind)程序无法初始化您的数组。

然而,您可以为绑定(bind)的配置类型设置默认值:

public class MyClass
{
    public int Value1 { get; set; }
    public int[] Value2 { get; set; } = Array.Empty<int>();
}

现在,如果您将具有该空数组的配置绑定(bind)到该类型,Value2 将永远不会被绑定(bind)器触及,保持其默认值不变。

关于c# - 为什么将属性初始化为 null 而不是配置中的空列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935614/

相关文章:

不使用 xaml 的 C# 样式

c# - 如何从 "ErrorMessage"翻译 "Custom Attribute"

c# - 在 ASP.NET Core 2.1 中设置选定的选项

asp.net-core - 我可以在 ASP.net Core 2.0 Preview 的 appsettings.json 中设置监听 URL 吗?

c# - root 的 XML 反序列化错误

c# - LoadFromContext 发生

c# - 是否有可能使用 .NET Core 获取未在 EFCore 中提交的添加项?

c# - REST API token 认证

c# - AJAX 发布数据到达 ASP.NET Core 2.1 Controller 时为空

asp.net-core - Hangfire 作业未在我的 Asp .Net Core 站点上运行