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

