有外的箱子验证在DataAnnotations命名空间枚举值?(Is there out-of-th

2019-07-18 08:01发布

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)在我的单元测试完成。

Answer 1:

有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));
}


Answer 2:

什么你要找的是:

 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?