如何验证FluentValidator C中的枚举#

时间:2017-01-06 17:27:38

标签: c# fluentvalidation

我正在使用C#中的FluentValidation创建验证类,以验证Type类的Account属性是否为AccountType枚举类型。

这是正确的实施方式:

RuleFor (account => account.Type)
             .IsInEnum (....)

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

public static bool IsDefinedInEnum(this Enum value, Type enumType)
{
    if (value.GetType() != enumType)
        return false;

    return Enum.IsDefined(enumType, value);
}

代码可以使用一些解释:

  • 第一次检查只是确保枚举的值和枚举的类型相同。如果不是,则该方法必须返回false。但为什么这有必要呢? Enum.IsDefined也会涵盖这一点,对吗?

    理想情况下,我们需要一个带有以下签名的方法:IsDefinedIn<T>(this T value) where T: Enum。这在编译时是完全类型安全的,但遗憾的是,约束T: Enum无效。这意味着enumType可以是任何内容,例如typeof(object),语言中没有机制将enumType限制为只有枚举类型。这可以使Enum.IsDefined抛出,如果你不想发生这种情况,你应该保留第一次检查。

    如果传递某些不是Enum的类型是代码中的错误,请考虑应该抛出(或断言)。我刚刚告诉你如何在必要时解决这个问题。

  • 第二项检查只是确保在枚举中定义了值。 SomeEnumeration.SomeValue将返回true(SomeEnumeration)5将返回false,除非该枚举的成员具有该值。

答案 1 :(得分:0)

我问自己同样的事情,然后我用Google搜索并在这里找到了你的问题。 这并没有多大帮助。然而它确实让我去看看github上的源代码和单元测试,谢谢你。 https://github.com/JeremySkinner/FluentValidation/blob/master/src/FluentValidation.Tests/EnumValidatorTests.cs

我把它放在这里为下一个带有同样问题的人。您不需要为IsInEnum()函数提供任何实现。此函数使用反射来确定规则中指定的属性的枚举类型,然后根据枚举的有效值验证该属性的值。