如何在FluentValidation中为泛型Request<T>的Records设置SetValidator?
泛型Request的FluentValidation验证方案
你遇到的类型转换错误,核心原因是QuotasValidator是针对Quotas类型的验证器,而泛型RequestValidator<T>中的T是任意class类型,直接调用SetValidator<T>会因为类型不兼容报错——只有当T恰好是Quotas时,QuotasValidator才能匹配IPropertyValidator<Request<T>, T>接口。
下面是两种开箱即用的解决方案:
方案1:基于泛型类型的条件验证
在RequestValidator<T>的构造函数中,通过typeof(T)判断当前泛型参数是否为Quotas,再针对性添加验证规则:
public class RequestValidator<T> : AbstractValidator<Request<T>> where T : class { public RequestValidator() { // 仅当T是Quotas类型时,添加Records的验证规则 if (typeof(T) == typeof(Quotas)) { // 方式一:通过Cast转换类型后设置验证器 RuleForEach(request => request.Records.Cast<Quotas>()) .SetValidator(new QuotasValidator()); // 方式二:用OfType筛选出Quotas类型元素(效果和方式一一致) // RuleForEach(request => request.Records.OfType<Quotas>()) // .SetValidator(new QuotasValidator()); } } }
方案2:使用多态验证器(PolymorphicValidator)
如果T是一个基类,Records中可能包含Quotas等多个子类实例,可以用FluentValidation内置的PolymorphicValidator来处理不同类型的验证逻辑:
public class RequestValidator<T> : AbstractValidator<Request<T>> where T : class { public RequestValidator() { RuleForEach(x => x.Records) .SetValidator(new PolymorphicValidator<T>() .Add<Quotas>(new QuotasValidator()) // 可扩展添加其他子类的验证器 // .Add<OtherSubclass>(new OtherSubclassValidator()) ); } }
这种方式不需要手动判断类型,PolymorphicValidator会自动根据元素的实际类型匹配对应的验证器,适合多态场景。
这两种方案都不需要自定义验证器实现,直接用FluentValidation的现有功能即可解决问题。
内容的提问来源于stack exchange,提问作者Zulander
相关产品推荐
相关产品推荐

