C# 如何直接根据列表进行验证<;T>;?

C# 如何直接根据列表进行验证<;T>;?,c#,fluentvalidation,C#,Fluentvalidation,我有一个模型课: public class MyModel() { //properties here... } 我想验证MyModel对象的列表。所以我创建了这个验证器: class MyModelListValidator : AbstractValidator<List<MyModel>> { public MyModelListValidator () { RuleFor(x => x) .SetCo

我有一个模型课:

public class MyModel() { //properties here... }
我想验证
MyModel
对象的列表。所以我创建了这个验证器:

class MyModelListValidator : AbstractValidator<List<MyModel>>
{
    public MyModelListValidator ()
    {
        RuleFor(x => x)
            .SetCollectionValidator(new MyModelValidator())
            .When(x => x != null);
    }

    private class MyModelValidator : AbstractValidator<MyModel>
    {
        public MyModelValidator()
        {
            //MyModel property validation here...
        }
    }
}
类MyModelListValidator:AbstractValidator
{
公共MyModelListValidator()
{
规则(x=>x)
.SetCollectionValidator(新的MyModelValidator())
.When(x=>x!=null);
}
私有类MyModelValidator:AbstractValidator
{
公共MyModelValidator()
{
//这里是MyModel属性验证。。。
}
}
}
但上述方法不起作用。另一种方法是创建一个类,如:

public class MyModelList()
{
    public List<MyModel> Items { get; set; }
}
公共类MyModelList()
{
公共列表项{get;set;}
}
这会奏效的


但是,有没有一种方法可以在不使用此附加类的情况下执行此操作?

如果使用数据注释执行验证,则可能需要自定义属性:

public class EnsureOneElementAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list.Count > 0;
        }
        return false;
    }
}
然后:

[EnsureOneElement(ErrorMessage = "At least a person is required")]
public List<Person> Persons { get; private set; }
or to make it more generic:

public class EnsureMinimumElementsAttribute : ValidationAttribute
{
    private readonly int _minElements;
    public EnsureMinimumElementsAttribute(int minElements)
    {
        _minElements = minElements;
    }

    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list.Count >= _minElements;
        }
        return false;
    }
}
[EnsureMinimumElements(1, ErrorMessage = "At least a person is required")]
public List<Person> Persons { get; private set; }
Personally I use FluentValidation.NET instead of Data Annotations to perform validation because I prefer the imperative validation logic instead of the declarative. I think it is more powerful. So my validation rule would simply look like this:

RuleFor(x => x.Persons)
    .Must(x => x.Count > 0)
    .WithMessage("At least a person is required");
[EnsureOneElement(ErrorMessage=“至少需要一个人”)]
公共列表人员{get;private set;}
或者让它更通用:
公共类EnsureMinimumElementsAttribute:ValidationAttribute
{
私有只读组件;
公共安全设施设施属性(内部设施)
{
_矿物质=矿物质;
}
公共覆盖布尔值有效(对象值)
{
var list=作为IList的值;
如果(列表!=null)
{
返回列表。计数>=\u元素;
}
返回false;
}
}
然后:

[EnsureOneElement(ErrorMessage = "At least a person is required")]
public List<Person> Persons { get; private set; }
or to make it more generic:

public class EnsureMinimumElementsAttribute : ValidationAttribute
{
    private readonly int _minElements;
    public EnsureMinimumElementsAttribute(int minElements)
    {
        _minElements = minElements;
    }

    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list.Count >= _minElements;
        }
        return false;
    }
}
[EnsureMinimumElements(1, ErrorMessage = "At least a person is required")]
public List<Person> Persons { get; private set; }
Personally I use FluentValidation.NET instead of Data Annotations to perform validation because I prefer the imperative validation logic instead of the declarative. I think it is more powerful. So my validation rule would simply look like this:

RuleFor(x => x.Persons)
    .Must(x => x.Count > 0)
    .WithMessage("At least a person is required");
[EnsureMinimumElements(1,ErrorMessage=“至少需要一个人”)]
公共列表人员{get;private set;}
就我个人而言,我使用FluentValidation.NET而不是数据注释来执行验证,因为我更喜欢命令式验证逻辑而不是声明式验证逻辑。我认为它更强大。因此,我的验证规则如下所示:
规则(x=>x.人)
.Must(x=>x.Count>0)
.WithMessage(“至少需要一个人”);

如果您的操作将
List
作为参数,您可以定义
AbstractValidator
,fluentvalidation将自动将其应用于列表中的每个项目。