C# 自定义验证框架
                           
天天向上
发布: 2025-04-19 10:00:22

原创
228 人浏览过

基于上章节,设计一个完整的 C# 自定义验证框架 实战项目,便于快速掌握,具有如下特点:


✅ 框架目标

  • 使用 Attribute(特性)定义验证规则
  • 使用 Reflection(反射)实现验证逻辑
  • 支持自定义扩展验证器
  • 支持验证错误提示信息
  • 支持验证分组(Group)机制(可选)
  • 可集成到 ASP.NET Core、WPF、WinForm 等项目中

一、自定义验证框架整体结构

ValidationFramework/
├── Attributes/
│   ├── RequiredAttribute.cs
│   ├── MaxLengthAttribute.cs
│   └── CustomValidatorAttribute.cs
├── Interfaces/
│   └── IValidator.cs
├── Validators/
│   └── ValidationEngine.cs
├── Models/
│   └── ValidationResult.cs
├── ExampleApp/
│   └── Program.cs

二、框架核心实现

1️⃣ Attribute 定义(Attributes/RequiredAttribute.cs)

[AttributeUsage(AttributeTargets.Property)]
public class RequiredAttribute : Attribute
{
    public string ErrorMessage { get; set; } = "字段不能为空";
}

👉 示例:MaxLengthAttribute.cs

[AttributeUsage(AttributeTargets.Property)]
public class MaxLengthAttribute : Attribute
{
    public int Length { get; }
    public string ErrorMessage { get; set; }

    public MaxLengthAttribute(int length)
    {
        Length = length;
        ErrorMessage = $"字段长度不能超过 {length}";
    }
}

2️⃣ ValidationResult 实体类(Models/ValidationResult.cs)

public class ValidationResult
{
    public bool IsValid => !Errors.Any();
    public List<string> Errors { get; set; } = new();
}

3️⃣ 验证核心类(Validators/ValidationEngine.cs)

public static class ValidationEngine
{
    public static ValidationResult Validate(object obj)
    {
        var result = new ValidationResult();
        var props = obj.GetType().GetProperties();

        foreach (var prop in props)
        {
            var value = prop.GetValue(obj);

            foreach (var attr in prop.GetCustomAttributes())
            {
                switch (attr)
                {
                    case RequiredAttribute req:
                        if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
                            result.Errors.Add(req.ErrorMessage);
                        break;

                    case MaxLengthAttribute maxLen:
                        if (value != null && value.ToString().Length > maxLen.Length)
                            result.Errors.Add(maxLen.ErrorMessage);
                        break;
                }
            }
        }

        return result;
    }
}

三、使用示例(ExampleApp/Program.cs)

public class UserDto
{
    [Required(ErrorMessage = "用户名是必填项")]
    [MaxLength(10, ErrorMessage = "用户名长度不能超过10")]
    public string Username { get; set; }

    [MaxLength(5)]
    public string Nickname { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var user = new UserDto
        {
            Username = "",     // 错误:Required
            Nickname = "太长的昵称" // 错误:MaxLength
        };

        var result = ValidationEngine.Validate(user);

        if (!result.IsValid)
        {
            Console.WriteLine("验证失败:");
            foreach (var error in result.Errors)
                Console.WriteLine($" - {error}");
        }
        else
        {
            Console.WriteLine("验证成功");
        }
    }
}

四、扩展功能设计

4.1 自定义验证器接口(Interfaces/IValidator.cs)

public interface IValidator
{
    bool IsValid(object value);
    string ErrorMessage { get; }
}

4.2 自定义验证特性(Attributes/CustomValidatorAttribute.cs)

[AttributeUsage(AttributeTargets.Property)]
public class CustomValidatorAttribute : Attribute
{
    public Type ValidatorType { get; }

    public CustomValidatorAttribute(Type validatorType)
    {
        ValidatorType = validatorType;
    }
}

4.3 实现一个示例验证器

public class EmailValidator : IValidator
{
    public string ErrorMessage => "邮箱格式不正确";

    public bool IsValid(object value)
    {
        var str = value as string;
        return !string.IsNullOrWhiteSpace(str) && str.Contains("@");
    }
}

4.4 扩展 ValidationEngine 支持自定义验证器

case CustomValidatorAttribute custom:
    var validator = (IValidator)Activator.CreateInstance(custom.ValidatorType);
    if (!validator.IsValid(value))
        result.Errors.Add(validator.ErrorMessage);
    break;

五、可选进阶特性(可后续加入)

特性描述
分组验证可通过 Group 属性控制验证阶段
条件验证通过表达式树控制某些字段是否触发验证
属性级联嵌套对象递归验证(类似 FluentValidation)
支持多语言提取错误提示到资源文件
与 ASP.NET Core 集成实现 IModelValidator 接口

参考资料


总结

这个验证框架完整体现了:

  • C# 中 Attribute 的高级用法
  • 反射动态获取类信息、执行逻辑
  • 支持自定义扩展和插件式验证器设计
  • 可灵活嵌入到任意业务项目中

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *