【发布时间】:2020-11-11 10:09:18
【问题描述】:
使用C# 9的新记录类型,如何在对象的构造过程中注入自定义参数验证/空值检查/等无需重新编写整个构造函数?
类似的东西:
record Person(Guid Id, string FirstName, string LastName, int Age)
{
override void Validate()
{
if(FirstName == null)
throw new ArgumentException("Argument cannot be null.", nameof(FirstName));
if(LastName == null)
throw new ArgumentException("Argument cannot be null.", nameof(LastName));
if(Age < 0)
throw new ArgumentException("Argument cannot be negative.", nameof(Age));
}
}
【问题讨论】:
-
如果您使用可空类型,则不需要空检查。如果要在构造时验证参数,请使用自定义构造函数而不是生成的构造函数。除此之外,验证的工作方式与任何其他类相同,例如通过数据注释、验证器等
-
我不确定这与记录类型有什么关系?
-
@PanagiotisKanavos 使用 NRT 时您仍然需要添加空检查——人们仍然可以通过
null,例如来自不知道为空的代码,或使用! -
请注意,
with { .. }仅适用于init的属性,因此如果您定义自己的构造函数,您将失去使用 withers 的能力
标签: c# validation c#-9.0 c#-record-type