[英]How to handle Enums in C# with Data Annotations and testing it with 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
到October
,并对其进行测试。 使用Xunit
作为https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-dotnet-test
[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)]
,你限制了string
的长度。
在 enum 的情况下:您不想使用其他值,然后从March
到October
,那么为什么要将它们保留在 enum 本身中呢? 从问题看来,您只想拥有这些值,因此它是有道理的:
public enum RestrictedMonth
{
March,
May,
June,
July,
August,
September,
October,
}
无论如何,如果这对您来说还不够,您可以使用params 作为 array定义您的自定义数据注释:
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; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.