首页 > 解决方案 > 接口底层对象的C#流利验证

问题描述

我有一个 azure 函数,我收到一个 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);
            });
        }
    }

标签: c#azure-functionsfluent

解决方案


更简洁的实现是使用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());
        });
    }
}

您还可以在此处查看他们的继承示例。


推荐阅读