我想限制我的DTO的值。
我有一个月的enum:
public enum Month
{
January,
February,
March,
May,
June,
July,
August,
September,
October,
November,
December
}
现在在我的DTO中我有:
public class MyDTO {
public Month Month{ get; set; }
}
我需要使用数据注释,以便只接受从March
到October
,并对其进行测试。以Xunit
为https://learn.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);
}
并检查Error
[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?
这看起来有点"俗气";恕我直言。数据注释是应该应用于类的属性的规则,以防止输入无效的值。这确认了该值将始终有效。它通常用于"太大"的值。以及可输入的值各不相同。以[StringLength(50, MinimumLength = 3)]
为例,您限制了string
的长度。
在enum的情况下:您不想使用March
到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; }
}