我已将我的项目升级到 netcore 3.0,我正在重构一个项目以使用新的可为空引用类型功能,但由于以下问题而很快陷入困境。
假设我使用了一个 REST api,它返回以下 JSON:
{
"Name": "Volvo 240",
"Year": 1989
}
Run Code Online (Sandbox Code Playgroud)
此 api 始终返回名称/年份,因此它们不可为空。
我会使用这个简单的类进行反序列化:
{
"Name": "Volvo 240",
"Year": 1989
}
Run Code Online (Sandbox Code Playgroud)
我会Car使用新的将其反序列化为一个实例System.Text.Json
public class Car
{
public string Name {get; set;}
public int Year {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
这一切都有效,但是当启用可为空引用类型时,我在声明为不可空但可以为空的Car类中收到警告Name。我明白为什么我会得到这个,因为可以在不初始化Name属性的情况下实例化这个对象。
所以理想情况下Car应该是这样的:
var car = JsonSerializer.Deserialize<Car>(json);
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为System.Text.Json序列化程序不支持带参数的构造函数。
所以我的问题是:我如何声明Car它Name是不可为空的并让它在System.Text.Json没有“不可为空”警告的情况下工作?`
我不想让它可以为空,因为在启用可为空引用类型时,我必须对基本上所有内容进行空检查,并且因为我的示例中的 REST API 说它们总是被提供,它们不应该为空。
json nullable-reference-types .net-core-3.0 system.text.json
有没有办法IOptions在运行时检索所有注册的?
我试图通过注入IServiceProvider然后执行以下操作来检索它们:
serviceProvider.GetServices(typeof(IOptions<>));
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为您无法获得开放类型的服务:
System.NotSupportedException:无法创建开放类型的数组。
有没有其他方法,或者我是否必须手动跟踪注册的 IOptions?