能递归检查DataAnnotations的验证函数
有时在Command和DTO之间层次比较多,写了个验证Command的函数,能实现递归验证.
比如下面这些有层级关系的class定义,能通过一句代码来进行验证:
class A { [Required] public B B { get; set; } } class B { [Range(10, 20)] public int C { get; set; } [Range(typeof(Guid), "00000000-0000-0000-0000-000000000001", "00000000-0000-0000-0000-000000000010")] public Guid aa { get; set; } public CC ddd { get; set; } } class CC { [Range(10, 20)] public int DDDDD { get; set; } [Required(ErrorMessage = "必须填写用户名")] [Display(Name = "用户名")] public string UserName { get; set; } [Required(ErrorMessage = "必须填写密码")] [DataType(DataType.Password)] [Display(Name = "密码")] public string Password { get; set; } }
验证函数调用:
List<BrokenRule> errors = obj.IsValid();
代码如下:
public class BrokenRule { public string Key { get; set; } public string Message { get; set; } } public static class DataAnnotationHelper { public static List<BrokenRule> IsValid<T>(this T o, bool only1Level = false) { return IsValid(typeof(T), o, only1Level); } private static List<BrokenRule> IsValid(Type t, object o, bool only1Level) { List<BrokenRule> errors = new List<BrokenRule>(); var descriptor = GetTypeDescriptor(t); foreach (PropertyDescriptor propertyDescriptor in descriptor.GetProperties()) { foreach (var validationAttribute in propertyDescriptor.Attributes.OfType<ValidationAttribute>()) { if (!validationAttribute.IsValid(propertyDescriptor.GetValue(o))) { BrokenRule error = new BrokenRule(); error.Key = propertyDescriptor.Name; error.Message = validationAttribute.FormatErrorMessage(propertyDescriptor.Name); errors.Add(error); } } } if (!only1Level) { if (o.GetType().IsClass&&!o.GetType().Equals(typeof(string))) { foreach (var p in o.GetType().GetProperties()) { object pValue = p.GetValue(o, null); if (pValue != null) { List<BrokenRule> pErrors = IsValid(p.PropertyType, pValue, only1Level); errors.AddRange(pErrors); } } } } return errors; } private static ICustomTypeDescriptor GetTypeDescriptor(Type type) { return new AssociatedMetadataTypeTypeDescriptionProvider(type).GetTypeDescriptor(type); } }
效果图:
自省推动进步,视野决定未来。
心怀远大理想。
为了家庭幸福而努力。
商业合作请看此处:https://www.magicube.ai
心怀远大理想。
为了家庭幸福而努力。
商业合作请看此处:https://www.magicube.ai
标签:
Validate
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】