7

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

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<T, DayOfWeek>()而不是期望的....IsInEnum<DayOfWeek>();. 我如何实现这一目标?

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

4

2 回答 2

11

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

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

于 2012-10-31T11:33:24.310 回答
4

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

干杯。

于 2016-02-26T16:10:20.753 回答