【问题标题】:Validating enums with a custom FluentValidator validator使用自定义 FluentValidator 验证器验证枚举
【发布时间】:2012-10-30 22:59:38
【问题描述】:

我创建了一个自定义验证器,它测试一个值是否在枚举的有效值范围内:

public class IsInEnumValidator<T> : PropertyValidator {
  public IsInEnumValidator() : base("Property {PropertyName} it not a valid enum value.") { }
  protected override bool IsValid(PropertyValidatorContext context) {
    if (!typeof(T).IsEnum) return false;
    return Enum.IsDefined(typeof(T), context.PropertyValue);
  }
}

还有一个链接验证器的扩展方法:

public static IRuleBuilderOptions<T, TProperty> IsInEnum<T, TProperty>(this IRuleBuilder<T, TProperty> ruleBuilder) {
  return ruleBuilder.SetValidator(new IsInEnumValidator<TProperty>());
}

我想这样使用它:

RuleFor(x => x.Day).IsInEnum<DayOfWeek>();

我的问题:

  1. 这不能按预期工作,因为我需要指定 ....IsInEnum&lt;T, DayOfWeek&gt;() 而不是所需的 ....IsInEnum&lt;DayOfWeek&gt;();。我该如何实现?

  2. 我想测试这个自定义验证器 - 不是用这个验证器测试我的数据,而是测试验证器本身。该库的文档解释了如何测试您的数据,而不是如何测试自定义验证器。库中似乎有很多测试代码,有什么我可以重用的吗?我使用 NUnit。

【问题讨论】:

    标签: c# unit-testing testing lambda fluentvalidation


    【解决方案1】:

    1:由于类型推断,您实际上不需要在IsInEnum() 调用中指定任何内容。

    2:对于测试,项目有很多测试可以适应这个场景。

    【讨论】:

      【解决方案2】:

      从 6.2 版开始,IsInEnum 是内置的。 从 6.2.1 开始支持可空枚举。

      干杯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 2010-09-06
        • 2012-07-01
        相关资源
        最近更新 更多