.NET技术-1.0.使用反射、特性简化代码(验证Model类)
使用反射、特性简化代码
参考项目:利用反射验证Model类/AssemblyVerification
假设现在有一个学生类(Student)
/// <summary>
/// 学生类
/// </summary>
public class Student
{
/// <summary>
/// 名字
/// </summary>
private string name;
public string Name
{
get { return name; }
set { name = value; }
} /// <summary>
/// 年龄
/// </summary>
public int Age { get; set; } /// <summary>
/// 地址
/// </summary>
public string Address { get; set; } /// <summary>
/// 性别
/// </summary>
public string Sex;
}
如果需要判断某些字段(属性)是否为空,是否大于0,便有以下代码:
public class RegexStudent
{
public static string ValidateStudent(Student student)
{
StringBuilder validateMessage = new StringBuilder(); if (string.IsNullOrEmpty(student.Name))
{
validateMessage.Append("名字不能为空");
} if (string.IsNullOrEmpty(student.Sex))
{
validateMessage.Append("性别不能为空");
} if (student.Age <= )
{
validateMessage.Append("年龄必填大于0");
} //...... 几百行 // 写到这里发现不对啊,如果必填项有20多个,难道我要一直这样写吗!
return validateMessage.ToString();
}
}
这样的代码,重用性不高,而且效率低。
我们可以用特性,反射,然后遍历属性并检查特性。
首先自定义一个【必填】特性类,继承自Attribute
/// <summary>
/// 【必填】特性,继承自Attribute
/// </summary>
public sealed class Require: Attribute
{
private bool isRequire;//必填 public bool IsRequire
{
get { return isRequire; }
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="isRequire">是否必填</param>
public Require(bool isRequire)
{
this.isRequire = isRequire;
}
}
然后用这个自定义的特性标记学生类的成员属性:
/// <summary>
/// 学生类
/// </summary>
public class Student
{
/// <summary>
/// 名字
/// </summary>
private string name; [Require(true)]
public string Name
{
get { return name; }
set { name = value; }
} /// <summary>
/// 年龄
/// </summary>
[Require(true)]
public int Age { get; set; } /// <summary>
/// 地址
/// </summary>
[Require(true)]
public string Address { get; set; } /// <summary>
/// 性别
/// </summary>
[Require(true)]
public string Sex;
}
通过特性检查类的属性:
public class RegexStudent
{
public static string CheckRequire<T>(T instance)
{
StringBuilder validateMsg = new StringBuilder(); Type t = typeof(T); var propertyInfos = t.GetProperties();
//有人会发现,Sex也标记了[Require(true)],为什么没有验证信息,
//这是因为,Sex没有实现属性{ get; set; },GetProperties是获取不到的。 foreach (var propertyInfo in propertyInfos)
{
Require require = (Require)Attribute.GetCustomAttribute(propertyInfo, typeof(Require)); //没标记,直接跳过
if (require == null)
{
continue;
} //获取属性的数据类型
var type = propertyInfo.PropertyType.ToString().ToLower(); //获取该属性的值
var value = propertyInfo.GetValue(instance, null); switch (type)
{
case "system.string":
{
if (string.IsNullOrEmpty((string)value) && require.IsRequire)
{
validateMsg.Append(propertyInfo.Name).Append("不能为空").Append(",");
}
}
break; case "system.int":
case "system.int32":
case "system.int64":
{
if ((int)value == && require.IsRequire)
{
validateMsg.Append(propertyInfo.Name).Append("必须大于0").Append(",");
}
}
break;
}
} return validateMsg.ToString().TrimEnd(',');
}
}
执行验证:
protected void Page_Load(object sender, EventArgs e)
{
Student student = new Student(); student.Name = "张三"; string strMsg = RegexStudent.CheckRequire<Student>(student); Response.Write(strMsg);
}
有人会发现,Sex也标记了[Require(true)],为什么没有验证信息,这是因为,Sex没有实现属性{ get; set; },GetProperties是获取不到的。
.NET技术-1.0.使用反射、特性简化代码(验证Model类)的更多相关文章
- 创建JDBC模板简化代码、JDBC应用的事务管理以及连接池的作用
一.创建JDBC模板简化代码 一个简单的查询.要做这么一大堆事情,并且还要处理异常,我们不防来梳理一下: 1.获取connection 2.获取statement 3.获取resultset 4 ...
- .Net Core3.0 WEB API 中使用FluentValidation验证,实现批量注入
为什么要使用FluentValidation 1.在日常的开发中,需要验证参数的合理性,不紧前端需要验证传毒的参数,后端也需要验证参数 2.在领域模型中也应该验证,做好防御性的编程是一种好的习惯(其实 ...
- C# 6.0语法新特性体验(二)
之前我在文章通过Roslyn体验C# 6.0的新语法中介绍了一些C# 6.0的语法特性,现在随着Visual Studio 14 CTP3的发布,又陆续可以体验一些新的特性了,这里简单的介绍一下之前没 ...
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
整体来说.Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心本身将不再变化(假设不了解.NET2.0的朋友,请參看MSDN或者一些经典的书籍 ...
- C# 3.0新语言特性和改进(一)
引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...
- C#7.0中有新特性
以下将是 C# 7.0 中所有计划的语言特性的描述.随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的大部分将活跃起来.现在是时候来展示这些特性,你也告诉借此告诉 ...
- paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较
paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...
- C# 6.0 的新特性
1. 自动的属性初始化器Auto Property initialzier 之前的方式: public class AutoPropertyBeforeCsharp6 { private string ...
- Atitit jquery 1.4--v1.11 v1.12 v2.0 3.0 的新特性
Atitit jquery 1.4--v1.11 v1.12 v2.0 3.0 的新特性 1.1. Jquery1.12 jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.h ...
随机推荐
- OneinStack——PHP多版本共存
前言 我事先安装的是LNMP环境,PHP版本为7.2,但是现在环境需要一个PHP5.6,所以就准备安装个上版本,顺带写个安装教程,写完后我发现了原来有直接安装的命令!所以后面的内容大家可以忽略了!从配 ...
- 欧拉筛,线性筛,洛谷P2158仪仗队
题目 首先我们先把题目分析一下. emmmm,这应该是一个找规律,应该可以打表,然后我们再分析一下图片,发现如果这个点可以被看到,那它的横坐标和纵坐标应该互质,而互质的条件就是它的横坐标和纵坐标的最大 ...
- python中的split()方法的使用
Python split()方法:通过指定分隔符对字符串进行分割并返回一个列表,默认分隔符为所有空字符,包括空格.换行(\n).制表符(\t)等. l Str.split()默认以空格,换行\n,制 ...
- ionic更改端口号
—— 重新指定端口号为8888 serve [options] ............................... 启动本地服务器进行开发测试 dev/testing [--console ...
- 为何在新线程中使用注解获取不到Spring管理的Bean
新建的线程类NewThread,在这个类中国使用Spring的注解获取Service,为null 网上已有这种问题的解决方案,但是为何在新线程中使用注解获取不到Spring管理的Bean? 问了老大, ...
- Ionic生成的App安装在手机上后无法联网的解决方案
在Ionic中使用inappbrowser.themeablebrowser 组件打开网页,刚开始是好的,后来不知添加什么插件,导致了安装在手机上以后没有网络访问权限. 尝试了很多,最后才发现,此时, ...
- Hdoj 1392.Surround the Trees 题解
Problem Description There are a lot of trees in an area. A peasant wants to buy a rope to surround a ...
- [luogu4072][bzoj4518][SDOI2016]征途【动态规划+斜率优化】
题目分析 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...
- HDU 6319 Problem A. Ascending Rating(单调队列)
要求一个区间内的最大值和每次数过去最大值更新的次数,然后求每次的这个值异或 i 的总和. 这个序列一共有n个数,前k个直接给出来,从k+1到n个数用公式计算出来. 因为要最大值,所以就要用到单调队列, ...
- Distinct Values(2018hdu多校第一场)
给你一段长度为n的区间,然后在给你m个小区间,要求这m个小区间里的每个人都不能重复,请你输出字典序最小的方案. 我们可以开一个suf数组,表示我到我后面的不出现重复数字的区间至少需要到达的位置.所以对 ...