基本类型的必需属性没有意义

Required attribute for primitive types makes no sense

在我的用例中,我需要一个必需的布尔值 属性,例如:

public class Todo 
{ 
    [Required] 
    public bool IsDone {get; set; } 
}

由于缺少布尔值 属性 的 属性 映射(未设置值),我在 Entity Framework 项目中遇到了一个错误。结果,我总是存储默认的布尔值“false”,而它实际上没有被填充。当没有被填充时,我希望抛出一个验证异常,但是因为它是一个原始类型,验证属性没有意义,因为它总是有一个默认值这足以通过。我不想有一个默认值,验证属性应该在未设置值时抛出异常。

我想出的一个解决方案是使用具有必需属性的可为空的布尔值。如果 属性 未设置,则 required 属性将抛出一个很好的异常。另一方面,拥有一个必需的可空布尔值是很奇怪的,因为你知道它总是被填充(由于必需的属性)并且它使得关于这个 属性 的业务逻辑可读性降低(IsDone.HasValue?IsDone.Value : false; /应该不可能,因为它是必需的/).

还有其他可能的解决方案吗?

这里有很多选项。 你想要的是一个三态机制:not set, true, false

Nullable bool 确实提供了这一点,但主要问题是消费者是否清楚这一点。

第二个选择是创建一个三态枚举并使用它。

  • 是不是更清楚了?也许
  • 它可以扩展吗?是的,但我们真的需要超过 3 个状态吗?

在这两者之间,我自己会使用可为空的布尔值。到头来是自取其辱。