我有一个 asp.net-core web api 项目,其配置包含以下定义:
"MyClass": {
"Value1": 1,
"Value2": []
}
此配置用于初始化以下类:
public class MyClass
{
public int Value1 { get; set; }
public int[] Value2 { get; set; }
}
此类在 Startup.cs
的 ConfigureServices
方法中使用以下代码从配置中初始化:
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;
}
在构造函数中,我注意到 Value2
是 null
,即使它确实在配置中显示为空列表 - 这是我希望该属性的值被初始化。我预计只有当配置中缺少该字段时,该属性才会用 null
初始化。有什么方法可以将字段初始化为空列表吗?
最佳答案
问题是 JSON 配置 loader 和配置 binder 是两个独立的组件。当您加载配置时,配置提供程序会将整个配置文件加载到键/值结构中,其中键是属性路径。在您的示例中,MyClass:Value2:0
和 MyClass:Value2:1
可能是您的 Value2
JSON 数组中两个数组元素的路径。
配置 binder 随后将解释该结构并将其转换为您的类的对象。届时,它将仅具有先前加载的键/值结构中存在的可用信息。
现在,如果您在绑定(bind)之前查看加载的配置,您会注意到空数组不会产生任何结果。如果您考虑路径的工作原理,它是有道理的:MyClass:Value2:0
和 MyClass: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/