青海省建设厅网站公示公告机刷推广软件
2026/4/18 7:23:20 网站建设 项目流程
青海省建设厅网站公示公告,机刷推广软件,免费无版权图片网站,网页设计与网站建设考试题目目标#xff1a; 像 [Required]、[MaxLength] 一样#xff0c;通过 Attribute 声明验证规则#xff0c; 通过 Reflection 自动执行验证逻辑#xff0c;彻底解耦业务代码。一、先看最终使用效果#xff08;非常重要#xff09;我们希望业务代码只长这样#x1f447;/// 像[Required]、[MaxLength]一样通过 Attribute 声明验证规则通过 Reflection 自动执行验证逻辑彻底解耦业务代码。一、先看最终使用效果非常重要我们希望业务代码只长这样/// summary /// 用户数据传输对象DTO /// 用于封装用户基础信息并通过特性标注数据验证规则 /// /summary public class UserDto { // 用户名 - 必填验证为空时提示指定错误信息 [Required(ErrorMessage 用户名不能为空)] // 用户名 - 最大长度验证超过10字符时提示指定错误信息 [MaxLength(10, ErrorMessage 用户名不能超过10个字符)] public required string UserName { get; set; } // 年龄 - 范围验证必须在18~60之间否则提示指定错误信息 [Range(18, 60, ErrorMessage 年龄必须在18~60之间)] public int Age { get; set; } }调用// 1. 创建用户数据传输对象(DTO)实例 var user new UserDto { UserName , // 用户名设为空字符串用于测试验证规则 Age 10 // 设置年龄为10 }; // 2. 调用验证器验证用户DTO的合法性 var result Validator.Validate(user); // 3. 判断验证结果如果验证不通过 if (!result.IsValid) { // 遍历所有验证错误并输出到控制台 foreach (var error in result.Errors) { Console.WriteLine(error); } } }返回结果用户名不能为空 年龄必须在18~60之间 没有 if / else 没有侵入业务代码 规则完全由 Attribute 声明二、整体架构设计先理解不要急着写1️⃣ 核心设计思想Attribute声明规则Validator扫描规则Rule执行规则1️⃣ 所有验证特性的基类2️⃣ 框架结构00009.手写 Attribute Reflection 验证框架 │ ├── Attributes │ ├── ValidationAttribute.cs // 验证基类 │ ├── RequiredAttribute.cs │ ├── MaxLengthAttribute.cs │ └── RangeAttribute.cs │ ├── Core │ ├── ValidationResult.cs │ └── Validator.cs // 核心引擎三、第一步定义验证 Attribute 的“统一抽象”1️⃣ 所有验证特性的基类namespace ConsoleApp1.Attributes { /// summary /// 验证特性抽象基类 /// 所有自定义验证特性如Required/Range等的父类继承Attribute使其可作为特性标记 /// /summary public abstract class ValidationAttribute : Attribute { /// summary /// 验证失败时的自定义错误提示信息 /// /summary public required string ErrorMessage { get; set; } /// summary /// 抽象验证方法核心逻辑 /// 由子类实现具体的验证规则判断传入值是否符合要求 /// /summary /// param namevalue待验证的属性值/param /// returns验证是否通过true有效false无效/returns public abstract bool IsValid(object value); } }设计要点✔ Attribute 只描述规则✔ 不关心属性名、对象✔ 只判断“值是否合法”四、第二步实现具体验证规则 Attribute1️⃣ Required必填namespace ConsoleApp1.Attributes { /// summary /// 必填验证特性 /// 验证属性值是否非空字符串需额外验证非空白 /// /summary public class RequiredAttribute : ValidationAttribute { /// summary /// 重写抽象验证方法实现必填验证规则 /// /summary /// param namevalue待验证的属性值/param /// returnstrue值有效非空/非空白false值无效/returns public override bool IsValid(object value) { // 规则1值为null直接验证失败 if (value null) return false; // 规则2字符串类型需验证非空白空字符串/全空格都算无效 if (value is string str) return !string.IsNullOrWhiteSpace(str); // 规则3非字符串且非null的类型如int/long默认验证通过 return true; } } }2️⃣ MaxLength字符串长度namespace ConsoleApp1.Attributes { /// summary /// 最大长度验证特性 /// 验证属性值转换为字符串后的长度不超过指定最大值 /// /summary public class MaxLengthAttribute : ValidationAttribute { // 最大长度阈值只读通过构造函数初始化 private readonly int _maxLength; /// summary /// 构造函数初始化最大长度验证的阈值 /// /summary /// param namemaxLength允许的最大字符长度/param public MaxLengthAttribute(int maxLength) { _maxLength maxLength; } /// summary /// 重写抽象验证方法实现最大长度验证规则 /// /summary /// param namevalue待验证的属性值/param /// returnstrue值长度≤阈值false值长度超出阈值/returns public override bool IsValid(object value) { // 规则1值为null时默认验证通过必填校验由RequiredAttribute单独处理 if (value null) return true; // 规则2将值转为字符串验证其长度是否≤最大长度阈值 return value.ToString().Length _maxLength; } } }3️⃣ Range数值区间public class RangeAttribute : ValidationAttribute { private readonly int _min; private readonly int _max; public RangeAttribute(int min, int max) { _min min; _max max; } public override bool IsValid(object value) { if (value null) return true; int intValue Convert.ToInt32(value); return intValue _min intValue _max; } }五、第三步核心引擎 —— Validator重点这一步是整个框架的灵魂.1️⃣ 验证结果模型namespace ConsoleApp1.Core { /// summary /// 验证结果封装类 /// 用于存储验证过程中的错误信息并标识整体验证是否通过 /// /summary public class ValidationResult { /// summary /// 验证是否通过只读 /// 错误集合为空时表示验证通过否则未通过 /// /summary public bool IsValid Errors.Count 0; /// summary /// 验证错误信息集合 /// 初始化时创建空列表避免空引用 /// /summary public Liststring Errors { get; } new(); } }2️⃣ Validator 核心实现Reflection 扫描// 引入自定义验证特性基类 using ConsoleApp1.Attributes; using System.Reflection; namespace ConsoleApp1.Core { /// summary /// 通用数据验证器静态类 /// 基于反射自定义验证特性实现对象属性的通用验证逻辑 /// /summary public static class Validator { /// summary /// 验证指定对象的所有带验证特性的属性 /// /summary /// param nameobj待验证的对象/param /// returns验证结果包含错误信息集合/returns public static ValidationResult Validate(object obj) { // 初始化验证结果对象用于存储错误信息 var result new ValidationResult(); // 边界校验验证对象为空时直接添加错误并返回 if (obj null) { result.Errors.Add(验证对象不能为空); return result; } // 获取对象的类型信息用于反射解析属性 Type type obj.GetType(); // 遍历对象的所有公共属性 foreach (PropertyInfo prop in type.GetProperties()) { // 获取当前属性的实际值 object value prop.GetValue(obj); // 获取当前属性上所有自定义验证特性 var attributes prop.GetCustomAttributesValidationAttribute(); // 遍历每个验证特性执行具体验证逻辑 foreach (var attr in attributes) { // 若验证不通过收集错误信息 if (!attr.IsValid(value)) { // 优先使用特性自定义错误信息无则使用默认提示 string error attr.ErrorMessage ?? ${prop.Name} 验证失败; result.Errors.Add(error); } } } // 返回最终验证结果 return result; } } }⚠️ 关键点✔ 只反射Property✔ 支持多个 Attribute✔ 不关心具体规则✔ 完全开放扩展六、完整测试示例// 引入核心功能命名空间包含UserDto和Validator验证器 using ConsoleApp1.Core; // 程序主命名空间 namespace ConsoleApp1 { // 程序入口类 internal class Program { // 程序主入口方法 static void Main(string[] args) { // 1. 创建用户数据传输对象(DTO)实例 var user new UserDto { UserName , // 用户名设为空字符串用于测试验证规则 Age 10 // 设置年龄为10 }; // 2. 调用验证器验证用户DTO的合法性 var result Validator.Validate(user); // 3. 判断验证结果如果验证不通过 if (!result.IsValid) { // 遍历所有验证错误并输出到控制台 foreach (var error in result.Errors) { Console.WriteLine(error); } } } } }输出用户名不能为空 年龄必须在18~60之间七、进阶一支持“属性名 错误消息”增强ValidationResultpublic class ValidationError { public string PropertyName { get; set; } public string Message { get; set; } }这样可以支持前端字段映射支持 JSON 返回 这就是 ASP.NET CoreModelState的雏形八、进阶二短路验证失败即停foreach (var attr in attributes) { if (!attr.IsValid(value)) { result.Errors.Add(attr.ErrorMessage); break; // 短路 } }九、进阶三缓存反射结果生产级static readonly DictionaryType, PropertyInfo[] _cache new(); PropertyInfo[] properties _cache.TryGetValue(type, out var props) ? props : _cache[type] type.GetProperties(); 真正慢的不是 Attribute是重复反射十、你已经“无缝理解” ASP.NET Core 验证体系了你刚才写的其实就是你写的ASP.NET CoreValidationAttributeValidationAttributeValidatorObjectModelValidatorValidateModel Binding ValidationValidationResultModelState十一、终极总结框架级认知Attribute 是规则的“声明语言”Reflection 是规则的“发现机制”Validator 是规则的“执行引擎”当你能手写出这一套时说明你已经真正理解 Attribute 的价值理解 Reflection 的正确用法具备设计“声明式框架”的能力

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询