.NET中特性+反射 实现数据校验
.NET中特性+反射 实现数据校验
在.NET中,我们可以使用特性+反射来实现数据校验。特性是一种用于为程序中的代码添加元数据的机制。元数据是与程序中的代码相关联的数据,但不直接成为代码的一部分。通过特性,我们可以为类、方法、属性等添加额外的信息,这些信息可以在运行时通过反射获取和使用。
对反射不太熟悉的小伙伴可以去看我以前的文章 .NET中的反射
为了实现数据校验,我们可以定义一个自定义特性,并将其应用于需要校验的属性或参数上。然后,我们可以编写代码来检查这些特性,并根据特性的配置执行相应的校验逻辑。
示例代码
定义自定义特性
using System;
using System.ComponentModel.DataAnnotations;
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public class ValidationAttribute : Attribute
{
public string ErrorMessage { get; set; }
public ValidationAttribute(string errorMessage)
{
ErrorMessage = errorMessage;
}
}
定义具体的校验特性
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public class RequiredAttribute : ValidationAttribute
{
public RequiredAttribute() : base("该字段是必填项。") { }
}
[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
public class RangeAttribute : ValidationAttribute
{
public int Minimum { get; set; }
public int Maximum { get; set; }
public RangeAttribute(int minimum, int maximum, string errorMessage = "该字段的值必须在 {0} 和 {1} 之间。")
: base(errorMessage)
{
Minimum = minimum;
Maximum = maximum;
}
}
在模型类中使用这些特性
public class Person
{
[Required]
public string Name { get; set; }
[Range(18, 100, ErrorMessage = "年龄必须在 18 到 100 之间。")]
public int Age { get; set; }
}
编写验证方法
public class Validator
{
public static bool Validate<T>(T obj, out string errorMessage)
{
errorMessage = null;
var type = typeof(T);
var properties = type.GetProperties();
foreach (var property in properties)
{
var validationAttributes = property.GetCustomAttributes(typeof(ValidationAttribute), true);
foreach (var attribute in validationAttributes)
{
var value = property.GetValue(obj);
switch (attribute)
{
case RequiredAttribute required:
if (value == null || (value is string str && string.IsNullOrWhiteSpace(str)))
{
errorMessage = required.ErrorMessage;
return false;
}
break;
case RangeAttribute range:
if (value is IComparable comparable)
{
if (comparable.CompareTo(range.Minimum) < 0 || comparable.CompareTo(range.Maximum) > 0)
{
errorMessage = string.Format(range.ErrorMessage, range.Minimum, range.Maximum);
return false;
}
}
break;
// 可以添加更多校验特性类型
}
}
}
return true;
}
}
使用Validator类来校验Person对象
class Program
{
static void Main(string[] args)
{
var person = new Person { Name = "张三", Age = 15 };
string errorMessage;
bool isValid = Validator.Validate(person, out errorMessage);
if (!isValid)
{
Console.WriteLine(errorMessage); // 输出:该字段是必填项。
}
Console.ReadLine();
}
}
说明
这个示例演示了如何使用特性和反射实现基本的数据校验。在实际应用中,你可能需要处理更复杂的校验逻辑和更多的校验类型。
此外,还可以使用现有的数据特性(如System.ComponentModel.DataAnnotations命名空间中的特性)来简化校验过程。
以下是该命名空间中一些常用的特性(Attribute),以及它们的用途:
| 特性名称 | 用途 |
|---|---|
[Required] |
确保属性值不为空(不为 null 且对于字符串不是空字符串)。 |
[StringLength] |
限制字符串属性的最大长度。 |
[Range] |
确保数值型属性在指定的范围内。 |
[Minimum] |
确保数值型属性不小于指定的最小值。 |
[Maximum] |
确保数值型属性不大于指定的最大值。 |
[RegularExpression] |
通过正则表达式验证属性值的格式。 |
[EmailAddress] |
验证属性值是否为有效的电子邮件地址。 |
[Url] |
验证属性值是否为有效的 URL。 |
[Phone] |
验证属性值是否为有效的电话号码。 |
[CreditCard] |
验证属性值是否为有效的信用卡号。 |
[Compare] |
比较两个属性值是否相等,常用于密码和确认密码的字段。 |
[DataType] |
指定数据的类型,例如日期、时间、电话号码等,并不验证数据,而是提供给数据绑定机制。 |
[CustomValidation] |
允许指定自定义验证逻辑。 |
[EnumDataType] |
验证属性值是否为指定枚举类型中的有效成员。 |
[StringLength] |
验证字符串长度是否在指定的范围内。 |
这些特性通常与ASP.NET Core或是ASP.NET MVC、Entity Framework等框架结合使用。
使用这些特性可以大大简化数据验证的代码,并且使验证逻辑与业务逻辑分离,提高代码的可维护性和可读性。
.NET中特性+反射 实现数据校验的更多相关文章
- SpringMVC中的 JSR 303 数据校验框架说明
JSR 303 是java为Bean数据合法性校验提供的标准框架,它已经包含在JavaEE 6.0中. JSR 303 通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则 ...
- wpf企业应用之数据校验
wpf中使用IDataErrorInfo实现数据校验,绑定实体需要实现了此接口,并在UI绑定表达式中添加ValidatesOnDataErrors=True,这样数据校验发生时,wpf会调用该接口中的 ...
- [WPF 基础知识系列] —— 绑定中的数据校验Vaildation
前言: 只要是有表单存在,那么就有可能有对数据的校验需求.如:判断是否为整数.判断电子邮件格式等等. WPF采用一种全新的方式 - Binding,来实现前台显示与后台数据进行交互,当然数据校验方式也 ...
- SpringMvc中的数据校验
SpringMvc中的数据校验 Hibernate校验框架中提供了很多注解的校验,如下: 注解 运行时检查 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素 ...
- struts2:数据校验,通过Action中的validate()方法实现校验,图解
根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种 Struts2中提供了一个com.opensymphony.xwork2.Valid ...
- struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)
前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ...
- struts中的数据校验
1.struts中如何进行数据校验 在每一个Action类中,数据校验一般都写在业务方法中,比如login().register()等.struts提供了数据校验功能.每个继承自ActionSuppo ...
- Struts2中validate数据校验的两种常用方法
本文主要介绍Struts2中validate数据校验的两种方法及Struts2常用校验器. 1.Action中的validate()方法 Struts2提供了一个Validateable接口,这个接 ...
- 利用kettle中的JS来完成ETL数据校验
最近参与了一个信托行业的BI项目,由于信托业务系统设计的问题,很多都是用户手工录入的数据,也有一些是需要分析的但是用户没有录入的数据,针对这样的数据质量,我们就要在ETL抽取的过程中来对数据流进行校验 ...
- C#中不同格式数据校验的正则表达式
网上经常看到用正则表达式校验数据的文章,有的虽然总结得很全,但是大多数都没有经过严格验证,错误较多. 本文包含三十余条不同格式数据校验的C#正则表达式,一般均附有说明,且在Visual Studio里 ...
随机推荐
- 在Centos 8 服务器用tmux多开窗口
在 CentOS 服务器上使用 tmux 来多开窗口是一个高效的方式.tmux 是一个终端复用器,它允许你在一个终端窗口中打开多个终端会话,还可以在会话之间轻松切换,非常适合长时间运行程序或多任务操作 ...
- 深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏
Java 修饰符 Java 修饰符 用于控制类.属性.方法和构造函数的访问权限和行为.它们可以分为两组: 访问修饰符: public: 意味着代码对所有类可访问. private: 意味着代码只能在声 ...
- 并发编程面试必备之ConcurrentHashMap源码解析
ConcurrentHashMap在我的面试生涯中,10次有8次是会被问到的,记得刚毕业那会,被问到ConcurrentHashMap源码的无助与苦涩,无奈只能网上找了一些教程,背一背,才算是蒙混过关 ...
- AI云增强升级!还原生动人像,拍出质感照片
近期不少细心用户发现,在用HUAWEI Mate 60 Pro手机拍照后,使用相册中的AI云增强功能,照片变得更加细腻有质感.这是因为AI云增强升级并更新支持了人像模式拍摄的照片,高清自然的人像细节还 ...
- 财务人提高竞争力必备的技能,怎么能少了ta!
从近年来大数据技术的发展趋势和相关产业飞速发展的状态,可以看出当前"数据分析"的热度可以说是有增无减,而且从市场上对数据分析人才的需求缺口也可以看出企业对数据分析的重视程度.未来随 ...
- HarmonyOS实现表单页面的输入,必填校验和提交
一. 样例介绍 本篇Codelab基于input组件.label组件和dialog组件,实现表单页面的输入.必填校验和提交: 1. 为input组件设置不同类型(如:text,email,date等 ...
- 最全能的AI换脸软件,FaceFusion下载介绍(可直播)
FaceFusion是一款多功能的AI换脸软件,它不仅能图片.视频换脸,还可以直播换脸,换脸效果真实.自然 与大多数换脸软件不同的是,FaceFusion不仅支持N卡处理程序(Azure),还额外提供 ...
- 【视频特辑】提效神器!如何用Quick BI高效配置员工的用数权限
简介:随着企业数字化进程逐步加速,企业所产生和积累的数据资源日益增多.每当员工的用数权限发生变动,管理员都需要进行复杂繁琐的重复性配置流程,不仅耗时耗力还容易出错. 如何能便捷地对员工用数权限进行高 ...
- 从操作系统层面分析Java IO演进之路
简介: 本文从操作系统实际调用角度(以CentOS Linux release 7.5操作系统为示例),力求追根溯源看IO的每一步操作到底发生了什么. 作者 | 道坚来源 | 阿里技术公众号 前言 本 ...
- Resin反序列化链分析
前言 Resin是一个轻量级的.高性能的开源Java应用服务器.它是由Caucho Technology开发的,旨在提供可靠的Web应用程序和服务的运行环境.和Tomcat一样是个服务器,它和hess ...