我正在使用C#中的FluentValidation
创建验证类,以验证Type
类的Account
属性是否为AccountType
枚举类型。
这是正确的实施方式:
RuleFor (account => account.Type)
.IsInEnum (....)
答案 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()函数提供任何实现。此函数使用反射来确定规则中指定的属性的枚举类型,然后根据枚举的有效值验证该属性的值。