我正在与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
视情况而定。
答案 0 :(得分:2)
您可以尝试检查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;
}
答案 1 :(得分:0)
您可以创建该泛型方法的专用版本,而将其称为:
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");
}