如何根据属性'运行时类型动态选择验证器

本文关键字:动态 类型 选择 验证 运行时 何根 属性 | 更新日期: 2023-09-27 18:16:19

给定一个基类,它有一个泛型参数,用于定义属性的类型,并且对另一个基类型有限制,当为派生类编写一个Fluent验证器时,该验证器如何切换哪个子验证器应用于泛型属性?

下面是一些示例类来演示这个配置:
public abstract class BaseParent<TChildType> where TChildType : BaseChild
{
    public TChildType Child {get; set;}
}
public abtract class BaseChild
{
    public sting ChildPropOne {get; set;}
}
public class ChildA : BaseChild
{
    public string ChildAPropOne {get; set;}
}
public class ChildB: BaseChild
{
    public string ChildBPropOne {get; set;}
}
public class ParentA<TChildType> : BaseParent<TChildType> where TChildType : BaseChild
{
    public string ParentAPropOne {get; set;}
}
public class ParentB<TChildType> : BaseParent<TChildType> where TChildType : BaseChild
{
    public string ParentBPropOne {get; set;}
}

我当前的设置强制为每个父类型+子类型组合使用不同的验证器类。理想情况下,我可以为每个父验证器和每个子验证器编写一个验证器并让父验证器能够选择调用哪个子验证器

如何根据属性'运行时类型动态选择验证器

您可以将子验证器实例注入父验证器,并为Child使用SetValidator属性:

public class ParentAValidator<TChildType> : AbstractValidator<ParentA<TChildType>> where TChildType : BaseChild
{
    public ParentAValidator(IValidator<TChildType> childValidator)
    {
        RuleFor(p => p.Child).SetValidator(childValidator);
    }
}