gpt4 book ai didi

c# - DataAnnotations 命名空间中的 Enum 值是否有开箱即用的验证器?

转载 作者:可可西里 更新时间:2023-11-01 08:16:44 25 4
gpt4 key购买 nike

C# 枚举值不仅限于其定义中列出的值,还可以存储其基类型的任何值。如果未定义基类型,则使用 Int32 或仅使用 int

我正在开发一个 WCF 服务,它需要确信某些枚举已经分配了一个值,而不是所有枚举的默认值 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 中?

更新。确保使用最后一个参数等于 TrueValidateObject(Object, ValidationContext, Boolean) 而不是 ValidateObject(Object, ValidationContext) 完成在我的单元测试中。

最佳答案

EnumDataType在 .NET4+ 中 ...

确保在对 ValidateObject 的调用中设置了第三个参数 validateAllProperties=true

所以从你的例子来看:

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

关于c# - DataAnnotations 命名空间中的 Enum 值是否有开箱即用的验证器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14381564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com