关于.NET Attribute在数据校验中的应用教程_实用技巧

来源:脚本之家  责任编辑:小易  

法语里的attribut,语法上叫表语。一般是由动词 être 引出的。比如 Je suis ingénieur.=我是工程师。(我=主语,是=系动词,当谓语,工程师=由系动词引出的表语)祝你愉快!www.zgxue.com防采集请勿采集本网。

前言

Attribute(特性)的概念不在此赘述了,相信有点.NET基础的开发人员都明白,用过Attribute的人也不在少数,毕竟很多框架都提供自定义的属性,类似于Newtonsoft.JSON中JsonProperty、JsonIgnore等

一、词义广泛性不一样 attribute to 1、认为(成功)是(努力)的结果 2、归因于;把….归因于;归咎于 如: The former she hoped at last might have been accidental,andthe latter she could

自定义特性

Attribut 翻译成中文是:属性 Attribut At·tri·but[atri`bu:t] 德汉-汉德词典 [das]-e ① 特征,属性,标志,象征 ②[语]定语 例句: der Dreizack als Attribut Neptuns 三叉戟作为海神尼普顿的

.NET 框架允许创建自定义特性,用于存储声明性的信息,且可在运行时被检索。该信息根据设计标准和应用程序需要,可与任何目标元素相关。

void_attribute_(type) 是一个函数 返回值为一个类型名;interrupt(char*) 也是一个函数 作用是将一个有标识作用的字符串转换为void_attribute_(type)可识别参数 SysTick_Handler(void) 仍是一个

创建并使用自定义特性包含四个步骤: 声明自定义特性 构建自定义特性 在目标程序元素上应用自定义特性 通过反射访问特性

右击我的电脑,属性,高级,环境变量在下面的系统变量里找PATH,找不到就自己新建一个,找到后双击,在变量值里输入 SystemRoot%\\system32(注意前面的分号用来与前面的内容分隔),OK,试试吧。

声明自定义特性

$代表的是EL表达式。例如: {object.attribut} {object.attribut.attribut} 当EL在对表达式中的变量进行操作的时候,它通过pageContext.findAttribute(“”)的方式来查找变量。查找的范百围从page

一个新的自定义特性必须派生自System.Attribute类,例如:

public class FieldDescriptionAttribute : Attribute{ public string Description { get; private set; } public FieldDescriptionAttribute(string description) { Description = description; }}

public class UserEntity{ [FieldDescription("用户名称")] public string Name { get; set; }}

该如何拿到我们标注的信息呢?这时候需要使用反射获取

var type = typeof(UserEntity); var properties = type.GetProperties(); foreach (var item in properties) { if(item.IsDefined(typeof(FieldDescriptionAttribute), true)) { var attribute = item.GetCustomAttribute(typeof(FieldDescriptionAttribute)) as FieldDescriptionAttribute; Console.WriteLine(attribute.Description); } }

执行结果如下:

从执行结果上看,我们拿到了我们想要的数据,那么这个特性在实际使用过程中,到底有什么用途呢?

Attribute特性妙用

在实际开发过程中,我们的系统总会提供各种各样的对外接口,其中参数的校验是必不可少的一个环节。然而没有特性时,校验的代码是这样的:

public class UserEntity { /// <summary> /// 姓名 /// </summary> [FieldDescription("用户名称")] public string Name { get; set; } /// <summary> /// 年龄 /// </summary> public int Age { get; set; } /// <summary> /// 地址 /// </summary> public string Address { get; set; } }

UserEntity user = new UserEntity(); if (string.IsNullOrWhiteSpace(user.Name)) { throw new Exception("姓名不能为空"); } if (user.Age <= 0) { throw new Exception("年龄不合法"); } if (string.IsNullOrWhiteSpace(user.Address)) { throw new Exception("地址不能为空"); }

字段多了之后这种代码就看着非常繁琐,并且看上去不直观。对于这种繁琐又恶心的代码,有什么方法可以优化呢?

使用特性后的验证写法如下:

首先定义一个基础的校验属性,提供基础的校验方法

public abstract class AbstractCustomAttribute : Attribute { /// <summary> /// 校验后的错误信息 /// </summary> public string ErrorMessage { get; set; } /// <summary> /// 数据校验 /// </summary> /// <param name="value"></param> public abstract void Validate(object value); }

然后可以定义常用的一些对应的校验Attribute,例如RequiredAttribute、StringLengthAttribute

/// <summary> /// 非空校验 /// </summary> [AttributeUsage(AttributeTargets.Property)] public class RequiredAttribute : AbstractCustomAttribute { public override void Validate(object value) { if (value == null || string.IsNullOrWhiteSpace(value.ToString())) { throw new Exception(string.IsNullOrWhiteSpace(ErrorMessage) ? "字段不能为空" : ErrorMessage); } } } /// <summary> /// 自定义验证,验证字符长度 /// </summary> [AttributeUsage(AttributeTargets.Property)] public class StringLengthAttribute : AbstractCustomAttribute { private int _maxLength; private int _minLength; public StringLengthAttribute(int minLength, int maxLength) { this._maxLength = maxLength; this._minLength = minLength; } public override void Validate(object value) { if (value != null && value.ToString().Length >= _minLength && value.ToString().Length <= _maxLength) { return; } throw new Exception(string.IsNullOrWhiteSpace(ErrorMessage) ? $"字段长度必须在{_minLength}与{_maxLength}之间" : ErrorMessage); } }

添加一个用于校验的ValidateExtensions

public static class ValidateExtensions { /// <summary> /// 校验 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static void Validate<T>(this T entity) where T : class { Type type = entity.GetType(); foreach (var item in type.GetProperties()) { //需要对Property的字段类型做区分处理针对Object List 数组需要做区分处理 if (item.PropertyType.IsPrimitive || item.PropertyType.IsEnum || item.PropertyType.IsValueType || item.PropertyType == typeof(string)) { //如果是基元类型、枚举类型、值类型或者字符串 直接进行校验 CheckProperty(entity, item); } else { //如果是引用类型 var value = item.GetValue(entity, null); CheckProperty(entity, item); if (value != null) { if ((item.PropertyType.IsGenericType && Array.Exists(item.PropertyType.GetInterfaces(), t => t.GetGenericTypeDefinition() == typeof(IList<>))) || item.PropertyType.IsArray) { //判断IEnumerable var enumeratorMI = item.PropertyType.GetMethod("GetEnumerator"); var enumerator = enumeratorMI.Invoke(value, null); var moveNextMI = enumerator.GetType().GetMethod("MoveNext"); var currentMI = enumerator.GetType().GetProperty("Current"); int index = 0; while (Convert.ToBoolean(moveNextMI.Invoke(enumerator, null))) { var currentElement = currentMI.GetValue(enumerator, null); if (currentElement != null) { currentElement.Validate(); } index++; } } else { value.Validate(); } } } } } private static void CheckProperty(object entity, PropertyInfo property) { if (property.IsDefined(typeof(AbstractCustomAttribute), true))//此处是重点 { //此处是重点 foreach (AbstractCustomAttribute attribute in property.GetCustomAttributes(typeof(AbstractCustomAttribute), true)) { if (attribute == null) { throw new Exception("AbstractCustomAttribute not instantiate"); } attribute.Validate(property.GetValue(entity, null)); } } } }

新的实体类

public class UserEntity { /// <summary> /// 姓名 /// </summary> [Required] public string Name { get; set; } /// <summary> /// 年龄 /// </summary> public int Age { get; set; } /// <summary> /// 地址 /// </summary> [Required] public string Address { get; set; } [StringLength(11, 11)] public string PhoneNum { get; set; } }

调用方式

UserEntity user = new UserEntity();user.Validate();

上面的校验逻辑写的比较复杂,主要是考虑到对象中包含复杂对象的情况,如果都是简单对象,可以不用考虑,只需针对单个属性做字段校验

现有的方式是在校验不通过的时候抛出异常,此处大家也可以自定义异常来表示校验的问题,也可以返回自定义的校验结果实体来记录当前是哪个字段出的问题,留待大家自己实现

如果您有更好的建议和想法欢迎提出,共同进步

总结

到此这篇关于.NET Attribute在数据校验中的应用的文章就介绍到这了,更多相关.NET Attribute在数据校验的应用内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

attribut翻译成中文是:m.属性;特征,标志;表语attribut音标:[atriby]法汉-汉法词典n.m.属性,品质,特性;象征,标志;[语]表语常见用法attribut du sujet主语的表语adjectif attribut表语形容词内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 详解.net core 权限验证与授权(authorizefilter、actionfilterattribute)
  • asp.net mvc使用actionfilterattribute实现权限限制的方法(附demo源码下载)
  • .net获取枚举descriptionattribute描述信息性能改进的多种方法
  • asp.net mvc利用actionfilterattribute过滤关键字的方法
  • 遍历hashtable 的几种方法
  • 关于 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。的
  • 基于asp.net mvc的abp框架入门学习教程
  • asp.net存储过程实现分页效果(三层架构)
  • xpath的数据和节点类型以及xpath中节点匹配的基本方法
  • asp.net使用fck编辑器中的分页符实现长文章分页功能
  • iis部署asp.net mvc网站的方法
  • c# 事件的设计与使用深入理解
  • javascript实现listbox左右移动实现代码
  • asp.net无法获取iis目录的问题解决方法
  • attribut是什么意思 《法语助手》法汉
  • 法语attribut是什么意思?
  • ich habe eine Frage über "Partizip als Attribut".
  • attrib命令具体如何执行呢
  • attribute to与credit to 的区别
  • Attribut是什么意思 《德语助手》德汉
  • C++中ARM Stm32的中断问题? extern "C" { void
  • 要用attrib命令却提示:'attrib' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • jsp中“$”是什么意思?
  • lα的读音字有哪些
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧详解.net core 权限验证与授权(authorizefilter、actionfilterattribute)asp.net mvc使用actionfilterattribute实现权限限制的方法(附demo源码下载).net获取枚举descriptionattribute描述信息性能改进的多种方法asp.net mvc利用actionfilterattribute过滤关键字的方法遍历hashtable 的几种方法关于 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。的基于asp.net mvc的abp框架入门学习教程asp.net存储过程实现分页效果(三层架构)xpath的数据和节点类型以及xpath中节点匹配的基本方法asp.net使用fck编辑器中的分页符实现长文章分页功能iis部署asp.net mvc网站的方法c# 事件的设计与使用深入理解javascript实现listbox左右移动实现代码asp.net无法获取iis目录的问题解决方法java正则表达式 pattern和matche未将对象引用设置到对象的实例 (asp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net对路径"xxxxx"asp.net汉字转拼音和获取汉字首字asp.net缓存的方法和最佳实践.net winfrom中给文本框添加拖放事件的代学习制作mvc4分页控件(下)asp.net datagridview自动换行的小例子asp.net mvc运行出现uncaught typeerror:防止重复提交 仅提交一次的终极绝杀技关于asp.net页面打印技术的常用方法总结asp.net core 导入导出excel xlsx 文件实.net中的集合排序可以这么玩你知道吗用扩展方法优化多条件查询(不定条件查询)
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved