接口底层对象的C#流利验证

问题描述

我有一个蔚蓝函数,我收到一个json包含的Json

List<Iinterface> objects {get;set;}

然后我可以有几个实现Iinterface的对象

public class A : Iinterface { ... }

json转换器实际上会解析类型,因此,如果我调用.GetType,则会在列表的项目上获得正确的底层类型!

但是我需要根据底层类型进行验证!

我知道了,但是我能做得更好吗?

public class IinterfaceValidator : AbstractValidator<Iinterface>
    {
        public IinterfaceValidator (AValidator aValidator)
        {
            When(x => x.GetType() == typeof(A),() =>
            {
                RuleFor(x => (A)x)
                    .SetValidator(aValidator);
            });
        }
    }

解决方法

更简洁的实现方法是使用SetInheritanceValidator。假设您分别具有以下类的验证器AValidatorBValidator

public class A : Iinterface { ... }

public class B : Iinterface { ... }

然后,您为Iinterface定义一个验证器,如下所示。请注意,我正在使用子验证程序的惰性初始化,以避免在初始化期间创建实例。

public class IinterfaceValidator : AbstractValidator<Iinterface> 
{
    public IinterfaceValidator() {
        RuleFor(x => x).SetInheritanceValidator(v => {
            v.Add<A>(i => new AValidator())
             .Add<B>(i => new BValidator());
        });
    }
}

您还可以查看其继承示例here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...