c# - 如何使用数据注释在 C# 中处理枚举并使用 XUnit 对其进行测试
问题描述
我想限制我的 DTO 的值。
我有几个月的枚举:
public enum Month
{
January,
February,
March,
May,
June,
July,
August,
September,
October,
November,
December
}
现在在我的 DTO 中,我有:
public class MyDTO {
public Month Month{ get; set; }
}
我需要使用数据注释才能仅接受 From March
toOctober
并对其进行测试。与https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-dotnet-testXunit
_
[Fact]
public void valid DTO_Months_ok()
{
var dto = MyDTO()
{
Month = Month.March
}
var result = dto.validate();
Assert.Equal(0, result.Count);
}
并检查错误
[Fact]
public void valid DTO_Months_Error()
{
var dto = MyDTO()
{
Month = Month.February
}
var result = dto.validate();
Assert.Equal(1, result.Count);
}
我的问题是 DataAnnotation。
如何将 DataAnnotation 与 Enum 一起使用?
解决方案
这看起来有点“hacky”恕我直言。DataAnnotations 是应用于类属性的规则,以防止输入无效值。这确认该值将始终有效。通常它应用于“太大”和“可以输入的值不同”的值。例如[StringLength(50, MinimumLength = 3)]
,您限制 a 的长度string
。
在 enum 的情况下:您不想使用其他值然后 from March
to October
,那么为什么将它们保留在 enum 本身中呢?从问题来看,您似乎只想拥有这些值,因此它是有意义的:
public enum RestrictedMonth
{
March,
May,
June,
July,
August,
September,
October,
}
无论如何,如果这对您来说还不够,您可以使用参数将自定义数据注释定义为数组:
public class EnumInRangeAttribute : ValidationAttribute
{
public Month[] ValidMonths { get; set; }
public EnumInRangeAttribute()
{
ValidMonths = new Month[0];
}
public EnumInRangeAttribute(params Month[] ValidMonths)
{
this.ValidMonths = ValidMonths;
}
public override bool IsValid(object value)
{
if (value is Month monthValue)
{
return ValidMonths.Contains(monthValue);
}
return true;
}
}
public class MyDTO {
[EnumInRange(Month.March,
Month.May,
Month.June,
Month.July,
Month.August,
Month.September,
Month.October)]
public Month Month { get; set; }
}
推荐阅读
- android - 三星中断中的指纹覆盖
- c# - 在字符串中查找前后随机数字的单词
- variables - 使用 var 的每个元素在 Mule 中发出 http 请求
- python - 遍历熊猫中的每个列名后更改列名
- wicket - 如何使用 StringResourceModel 显示带有一个简单参数的简单检票口消息
- angular - 如何隐藏导航 url Ionic 4
- css - 使用固定标题强制 td 与表中的 th 宽度相同
- groovy - 无法更新新链接的问题 - Jira/Scriptrunner - Epic/Epic 中的问题
- python - Python3:导入类问题
- oracle - 如何将 SRW 包添加到现有的 Oracle 数据库?