You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在IValidatableObject的Validate方法中返回多个ValidationResult?

优化IValidatableObject.Validate方法的多结果返回实现

先纠正一个误区

yield return 并非只能返回单个结果——你可以在方法中多次调用它,最终会返回包含所有结果的完整IEnumerable<ValidationResult>序列。


方案一:改进List存储写法

原代码的问题在于无验证错误时没有返回值,这会导致编译错误(方法声明了返回值,但存在路径未返回)。优化后直接返回集合,空集合就代表无验证错误:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    var validationResults = new List<ValidationResult>();

    if (QuantityTraded < 1 || QuantityTraded > MaxTradeQuantity)
    {
        validationResults.Add(new ValidationResult($"交易数量必须大于0且小于{MaxTradeQuantity}"));
    }
    if (TotalAmount > TotalPortfolioCash)
    {
        validationResults.Add(new ValidationResult($"当前投资组合可用资金({TotalPortfolioCash})不足以支付此订单"));
    }

    // 无论有没有错误都返回,空List即表示无验证问题
    return validationResults;
}

这种方式逻辑直观,适合需要对验证结果做额外处理(比如排序、去重)的场景。


方案二:正确使用yield return返回多个结果

直接在每个验证不通过的分支里调用yield return,方法会自动将这些结果组合成序列;无错误时,方法会返回空的Enumerable,无需额外处理:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    if (QuantityTraded < 1 || QuantityTraded > MaxTradeQuantity)
    {
        yield return new ValidationResult($"交易数量必须大于0且小于{MaxTradeQuantity}");
    }
    if (TotalAmount > TotalPortfolioCash)
    {
        yield return new ValidationResult($"当前投资组合可用资金({TotalPortfolioCash})不足以支付此订单");
    }
    // 无错误时自动返回空序列,不用写额外代码
}

这种写法更简洁,不需要额外创建List,内存占用更低,适合独立的验证场景。


两种方案对比

  • List存储:适合需要提前收集所有结果再做处理的场景,内存中会暂存所有验证结果。
  • yield return:延迟执行,代码更轻便,适合简单的独立验证逻辑。

内容的提问来源于stack exchange,提问作者HoboJeff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:45:17