如何在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
相关产品推荐
相关产品推荐

