C# FluentValidation:将一个值与一组值进行比较?

C# FluentValidation:将一个值与一组值进行比较?,c#,fluentvalidation,C#,Fluentvalidation,在为单个类的属性制定简单规则时,我发现FluentValidation非常简单,但只要我需要比较集合(例如列表属性)中的值,它就会变得非常复杂。假设以下两个最小类: public class PurchaseOrder { public List<LineItem> LineItems { get; set; } public decimal Total { get; set; } public PurchaseOrder() { L

在为单个类的属性制定简单规则时,我发现FluentValidation非常简单,但只要我需要比较集合(例如列表属性)中的值,它就会变得非常复杂。假设以下两个最小类:

public class PurchaseOrder
{
    public List<LineItem> LineItems { get; set; }
    public decimal Total { get; set; }

    public PurchaseOrder()
    {
        LineItems = new List<LineItem>();
    }
}

public class LineItem
{
    public decimal Price { get; set; }
}
PurchaseOrderValidator如何确保所有LineItem.Price的总和等于PurchaseOrder.Total?这是一个存根,尽管我不确定必须这样做:

public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
    public PurchaseOrderValidator()
    {
        RuleFor(x => x.Total).Must(MatchSumOfLineItems);
    }

    private bool MatchSumOfLineItems(decimal arg)
    {
        return true;
    }
}

只需创建一个以PurchaseOrder作为输入的验证方法,并对其执行任何您想要的操作

public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
    public PurchaseOrderValidator()
    {
        RuleFor(x => x).Must(MatchSumOfLineItems);
    }

    private bool MatchSumOfLineItems(PurchaseOrder arg)
    {
        return arg.Total == arg.LineItems.Sum(i => i.Price);
    }
}

只需创建一个以PurchaseOrder作为输入的验证方法,并对其执行任何您想要的操作

public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
    public PurchaseOrderValidator()
    {
        RuleFor(x => x).Must(MatchSumOfLineItems);
    }

    private bool MatchSumOfLineItems(PurchaseOrder arg)
    {
        return arg.Total == arg.LineItems.Sum(i => i.Price);
    }
}
为什么不使用。平等

为什么不使用。平等


与验证无关,但为什么不返回get of Total属性中的LineItem价格之和,并将set Private设置为Private?这是一个遗留应用程序,目前,我的任务是验证输出,而不是对应用程序进行更改。您尝试了什么。您尝试验证的post代码为PurchaseOrderValidator添加了一个始终成功的存根。与验证无关,但为什么不在get of Total属性中返回LineItem价格的总和,并将set Private设置为Private?这是一个遗留应用程序,目前,我的任务是验证输出,不更改应用程序。您尝试了什么。您尝试验证的post代码为PurchaseOrderValidator添加了一个始终成功的存根。非常感谢。这正是我所希望的那种班轮。非常感谢。这正是我所希望的那种班轮。
public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
    public PurchaseOrderValidator()
    {
        RuleFor(x => x.Total).Must(MatchSumOfLineItems);
    }

    private bool MatchSumOfLineItems(PurchaseOrder order, decimal sum)
    {
        return sum == order.LineItems.Sum(i => i.Price);
    }
}
public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
    public PurchaseOrderValidator()
    {
        RuleFor(x => x.Total).Equal(x => x.LineItems.Sum(item => item.Price));
    }
}