c# - 派生类型的 FluentValidation SetCollectionValidator

标签 c# .net validation extension-methods fluentvalidation

如何在派生类型的集合项上设置验证器?

class BaseClass
{

}

class DerivedClass : BaseClass
{

}

class SomeClass
{
    public IEnumerable<BaseClass> BaseClasses { get; set; }
}

class DerivedClassValidator : AbstractValidator<DerivedClass>
{

}

class SomeClassValidator : AbstractValidator<SomeClass>
{
    public SomeClassValidator()
    {
        RuleFor(x => x.BaseClasses).????.SetCollectionValidator(new DerivedClassValidator);
    }
}

只是想知道...

有没有办法把它转换成一个特定的类型,比如

RuleFor(x => x.SomeCollection).CastTo(typeof(SomeDerivedType)).SetCollectionValidator(new SomeDerivedValidator());

最佳答案

您可以使用规则的条件包装来验证包含不同派生类型对象的集合。

假设您有下一个类层次结构:

public class BaseClass
{
    public string Name { get; set; }
}

public class DerivedClassOne : BaseClass
{
    public int Count { get; set; }
}

public class DerivedClassTwo : BaseClass
{
    public double Price { get; set; }
}

以及包含 BaseClass 对象集合的容器类:

public class ContainerClass
{
    public List<BaseClass> Collection { get; set; } 
}

主要思想是创建一个验证器类,负责所有类层次验证:

public class CommonBaseClassValidator : AbstractValidator<BaseClass>
{
    public CommonBaseClassValidator()
    {
        //common rule for all BaseClass types
        RuleFor(x => x.Name)
            .NotEmpty();

        // special rules for base type
        When(model => model.GetType() == typeof (BaseClass), () =>
        {
            RuleFor(x => x.Name)
                .Length(0, 10);
            // add rules here
        });

        //special rules for derived types
        When(model => model.GetType() == typeof(DerivedClassOne), () =>
        {
            RuleFor(model => ((DerivedClassOne) model).Count)
                .ExclusiveBetween(1, 9);
            // add rules here
        });

        When(model => model.GetType() == typeof(DerivedClassTwo), () =>
        {
            RuleFor(model => ((DerivedClassTwo) model).Price)
                .GreaterThan(1000);
            // add rules here
        });
    }
}

并将此类注册为集合项验证器:

public class ContainerValidator : AbstractValidator<ContainerClass>
{
    public ContainerValidator()
    {
        RuleFor(model => model.Collection)
            .SetCollectionValidator(new CommonBaseClassValidator());
    }
}

关于c# - 派生类型的 FluentValidation SetCollectionValidator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24948143/

相关文章:

c# - 父对象在 EntityState.Unchanged 中,但它仍然插入到数据库中

c# - hibernate "could not initialize a collection"

c# - 如何在.NET服务器端检索Http请求参数

插入时的 SQL 验证 - 只允许填充一列或另一列

java - 使用正则表达式验证字段

c# - BeginInvoke 内存泄漏

c# - 任务异步/等待不适用于 WPF,因为它在其他场景中有效

c# - IntPtr 不包含 native 值

c# - 显示 TextBlock 文本的工具提示(具有自定义样式)

go - 如何将验证器标记添加到嵌套字段