C#枚举值不限于仅在它的定义中所列的值,并且可以存储任何值的它的基类型。 如果基类型不大于限定Int32
或简单地int
被使用。
我正在开发一个WCF serivice这就需要有信心,一些枚举具有分配,而不是默认值,我开始与单元测试,以确定是否为0所有枚举值[Required]
将在这里做合适的工作。
using System.ComponentModel.DataAnnotations;
using Xunit;
public enum MyEnum
{
// I always start from 1 in order to distinct first value from the default value
First = 1,
Second,
}
public class Entity
{
[Required]
public MyEnum EnumValue { get; set; }
}
public class EntityValidationTests
{
[Fact]
public void TestValidEnumValue()
{
Entity entity = new Entity { EnumValue = MyEnum.First };
Validator.ValidateObject(entity, new ValidationContext(entity, null, null));
}
[Fact]
public void TestInvalidEnumValue()
{
Entity entity = new Entity { EnumValue = (MyEnum)(-126) };
// -126 is stored in the entity.EnumValue property
Assert.Throws<ValidationException>(() =>
Validator.ValidateObject(entity, new ValidationContext(entity, null, null)));
}
}
它没有,第二次测试并没有抛出任何异常。
我的问题是:是否有一个验证属性检查提供的值是Enum.GetValues
?
更新 。 确保使用的ValidateObject(Object, ValidationContext, Boolean)
与去年参数等于True
,而不是ValidateObject(Object, ValidationContext)
在我的单元测试完成。
有EnumDataType在.NET4 + ...
请确保您设置的第三个参数, validateAllProperties=true
在调用ValidateObject
所以从你的例子:
public class Entity
{
[EnumDataType(typeof(MyEnum))]
public MyEnum EnumValue { get; set; }
}
[Fact]
public void TestInvalidEnumValue()
{
Entity entity = new Entity { EnumValue = (MyEnum)(-126) };
// -126 is stored in the entity.EnumValue property
Assert.Throws<ValidationException>(() =>
Validator.ValidateObject(entity, new ValidationContext(entity, null, null), true));
}
什么你要找的是:
Enum.IsDefined(typeof(MyEnum), entity.EnumValue)
[更新+ 1]
在开箱验证,做了很多的验证,包括这一项被称为EnumDataType。 请确保您设置validateAllProperties =真为ValidateObject,否则你会导致测试失败。
如果你只是想检查,如果枚举定义,你可以使用与上述行自定义验证:
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = false)]
public sealed class EnumValidateExistsAttribute : DataTypeAttribute
{
public EnumValidateExistsAttribute(Type enumType)
: base("Enumeration")
{
this.EnumType = enumType;
}
public override bool IsValid(object value)
{
if (this.EnumType == null)
{
throw new InvalidOperationException("Type cannot be null");
}
if (!this.EnumType.IsEnum)
{
throw new InvalidOperationException("Type must be an enum");
}
if (!Enum.IsDefined(EnumType, value))
{
return false;
}
return true;
}
public Type EnumType
{
get;
set;
}
}
...但我想这是不是开箱那么是什么呢?
文章来源: Is there out-of-the box validator for Enum values in DataAnnotations namespace?