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

验证可为空string[]参数是否符合指定条件(Null为有效条件)

解决方案

你的核心问题是类型不匹配:Size是可空字符串数组(string[]?),但conditions.Contains(x)要求传入单个非空string;同时需求明确Size为null时视为有效。以下是修正后的实现:

public sealed class GetProductsQueryValidator : AbstractValidator<GetProductsQuery>
{
    public GetProductsQueryValidator()
    {
        var validSizes = new HashSet<string> { "m", "l", "s" }; // 用HashSet优化查找效率

        RuleFor(x => x.Size)
            .Must(size => size == null || size.All(s => validSizes.Contains(s)))
            .WithMessage($"请仅使用以下有效值:{string.Join(", ", validSizes)}");
    }
}

关键说明:

  • 用HashSet<string>替代List<string>:Contains操作的时间复杂度从O(n)降到O(1),适合频繁校验的场景
  • Must逻辑拆分:
    1. 先判断Size是否为null,是则直接通过验证
    2. 若不为null,用All方法校验数组中每一个元素都属于有效集合
  • 错误消息直接明确有效值范围,符合用户提示需求

如果需要更精准的错误提示(比如指出具体无效元素),可以追加RuleForEach规则:

public sealed class GetProductsQueryValidator : AbstractValidator<GetProductsQuery>
{
    public GetProductsQueryValidator()
    {
        var validSizes = new HashSet<string> { "m", "l", "s" };

        RuleFor(x => x.Size)
            .Must(size => size == null || size.All(s => validSizes.Contains(s)))
            .WithMessage($"存在无效尺寸值,请仅使用:{string.Join(", ", validSizes)}");

        // 针对单个元素给出具体错误提示
        RuleForEach(x => x.Size)
            .Must(s => validSizes.Contains(s))
            .WithMessage($"尺寸值 '{PropertyValue}' 无效,请使用:{string.Join(", ", validSizes)}");
    }
}

RuleForEach会自动跳过null数组的情况,无需额外判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:35:36