小编lan*_*gen的帖子

如何使用 System.Text.Json 处理可为空的引用类型?

我已将我的项目升级到 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序列化程序不支持带参数的构造函数。

所以我的问题是:我如何声明CarName是不可为空的并让它在System.Text.Json没有“不可为空”警告的情况下工作?`

我不想让它可以为空,因为在启用可为空引用类型时,我必须对基本上所有内容进行空检查,并且因为我的示例中的 REST API 说它们总是被提供,它们不应该为空。

json nullable-reference-types .net-core-3.0 system.text.json

17
推荐指数
1
解决办法
3511
查看次数

获取所有已注册的 IOptions

有没有办法IOptions在运行时检索所有注册的?

我试图通过注入IServiceProvider然后执行以下操作来检索它们:

serviceProvider.GetServices(typeof(IOptions<>));
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为您无法获得开放类型的服务:

System.NotSupportedException:无法创建开放类型的数组。

有没有其他方法,或者我是否必须手动跟踪注册的 IOptions?

c# .net-core asp.net-core

6
推荐指数
0
解决办法
329
查看次数