代码之家  ›  专栏  ›  技术社区  ›  Brandon

在自定义验证器中设置大小写不敏感

  •  1
  • Brandon  · 技术社区  · 6 年前

    Fluent Validation 在其中,我编写了一个自定义验证,用于检查属性的当前值是否包含以下任何值列表:

    IRuleBuilderOptions<T, TProperty> IsOfValue<T, TProperty> rule, params TProperty[] validOptions)
    {
       return rule
         .Must(validOptions.Contains)
         .WithMessage("Custom Error")
    }
    

    我的问题是。。。我怎样才能更改密码 Must(validOptions.Contains)

    对于不使用列表的变体,我可以很容易地做到这一点,但我无法理解在这里使用的逻辑。

    StringComparer.IgnoreOrdinalCase StringComparison.IgnoreOrdinalCase 依靠。

    2 回复  |  直到 6 年前
        1
  •  2
  •   D-Shih    6 年前

    你可以试试看 TProperty 类型,如果是 string 你可以用

    string.Contains(x.ToString(),StringComparer.OrdinalIgnoreCase)
    

    否则使用默认值。

    IRuleBuilderOptions<T, TProperty> IsOfValue<T, TProperty>(this IRuleBuilder<T, TProperty> rule, params TProperty[] validOptions)
    {
        IRuleBuilderOptions<T, TProperty> result = rule
                     .Must(validOptions.Contains)
                     .WithMessage("Custom Error");
    
       if(typeof(TProperty) == typeof(string)){
           string[] vailds = validOptions as string[];
           result = rule
                    .Must(x => vailds.Contains(x.ToString(),StringComparer.OrdinalIgnoreCase))
                    .WithMessage("Custom Error");
    
       }
    
       return result;
    }   
    
        2
  •  0
  •   Xiaoy312    6 年前

    您可以创建该泛型方法的专用版本,它将被调用:

    public static IRuleBuilderOptions<T, TProperty> IsOfValue<T, TProperty>(this IRuleBuilder<T, TProperty> rule, params TProperty[] validOptions)
    {
        return rule
            .Must(validOptions.Contains)
            .WithMessage("Custom Error");
    }
    
    public static IRuleBuilderOptions<T, string> IsOfValue<T>(this IRuleBuilder<T, string> rule, params string[] validOptions) => rule.IsOfValue(StringComparer.OrdinalIgnoreCase, validOptions);
    public static IRuleBuilderOptions<T, string> IsOfValue<T>(this IRuleBuilder<T, string> rule, StringComparer comparer, params string[] validOptions)
    {
        return rule
            .Must(x => validOptions.Contains(x, comparer))
            .WithMessage("Custom Error");
    }