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

如何在C#中创建验证IEnumerable含唯一值的自定义验证特性?

ASP.NET Core Web API 自定义DistinctValues验证特性实现

你只需要重写带ValidationContext的IsValid重载即可完成验证逻辑,这个重载能获取属性名称等上下文信息,方便返回更清晰的错误提示。以下是完整实现:

public class DistinctValuesAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // 非IEnumerable类型直接验证通过(可根据需求调整为验证失败)
        if (value is not IEnumerable enumerable)
        {
            return ValidationResult.Success;
        }

        var uniqueElements = new HashSet<object>();
        foreach (var element in enumerable)
        {
            // HashSet.Add返回false表示元素已存在,即出现重复
            if (!uniqueElements.Add(element))
            {
                return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
            }
        }

        return ValidationResult.Success;
    }

    // 自定义错误提示模板
    public override string FormatErrorMessage(string name)
    {
        return $"属性 {name} 中的值必须唯一,不能包含重复元素。";
    }
}

使用示例

public class Payload
{
    [DistinctValues]
    public IEnumerable<string> Names { get; set; }
}

注意事项

  • 若需要允许null值,可在开头添加if (value == null) return ValidationResult.Success;的判断
  • 对于自定义对象类型,需确保对象正确实现了Equals和GetHashCode方法,否则HashSet无法正确识别重复元素
  • 若不需要上下文信息,也可以重写无参数的IsValid重载,但带ValidationContext的版本灵活性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:42:36