基本类型的必需属性没有意义
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 个状态吗?
在这两者之间,我自己会使用可为空的布尔值。到头来是自取其辱。
在我的用例中,我需要一个必需的布尔值 属性,例如:
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 个状态吗?
在这两者之间,我自己会使用可为空的布尔值。到头来是自取其辱。