C# 自定义验证框架
基于上章节,设计一个完整的 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 的高级用法
- 反射动态获取类信息、执行逻辑
- 支持自定义扩展和插件式验证器设计
- 可灵活嵌入到任意业务项目中
更多详细内容请关注其他相关文章!