700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C#中使用反射以及特性简化的实例代码

C#中使用反射以及特性简化的实例代码

时间:2020-08-12 05:34:46

相关推荐

C#中使用反射以及特性简化的实例代码

后端开发|C#.Net教程

csharp,.net,简化

后端开发-C#.Net教程

彩虹网络任务源码,vscode代码是红色,ubuntu 15 qq,tomcat升级技术手册,爬虫porhub,php laravel框架,观澜seo推广公司,二手手机网站代码,网页动态菜单模板下载lzw

假设现在有一个学生类(Student)

手机版 音乐网站源码,vscode鼠标点击插件,ubuntu 插u盘,tomcat 防ddos,sqlite 破解,网页设计的div如何置顶,织梦数据库链接失败密码是正确的,服务器iis添加网站,android 桌面插件 源码,前端单体框架,衣服有爬虫,php 写入文件换行,seo优化一年多少钱,springboot时间化,动易标签模板,网站顶部加载进度条,易语言取数网页填表,bootstrap前端模板教程,网站上传服务器后台上传资料出错,html 淘宝静态登录页面模板,商店管理系统源文件,新闻发布php程序lzw

织梦贷款网站源码,ubuntu怎么删除空格,怎么配置tomcat6,大专学爬虫,.php是什么格式,新建区一站式seo优化lzw

{ { name =Age { ; Address { ;

如果需要判断某些字段(属性)是否为空,是否大于0,便有以下代码:

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 <= 0) {validateMessage.Append("年龄必填大于0"); } //...... 几百行 // 写到这里发现不对啊,如果必填项有20多个,难道我要一直这样写吗! return validateMessage.ToString(); }

这样的代码,重用性不高,而且效率低。

我们可以用特性,反射,然后遍历属性并检查特性。

首先自定义一个【必填】特性类,继承自Attribute

///public sealed class RequireAttribute : Attribute { private bool isRequire; public bool IsRequire { get { return isRequire; } } /// /// public RequireAttribute(bool isRequire) { this.isRequire = isRequire; } }

然后用这个自定义的特性标记学生类的成员属性:

///public class Student { /// private string name; [Require(true)] public string Name { get { return name; } set { name = value; } } /// [Require(true)] public int Age { get; set; } /// [Require(false)] public string Address { get; set; } /// [Require(true)] public string Sex; }

通过特性检查类的属性:

/// /// /// /// public static string CheckRequire(T instance) {var validateMsg = new StringBuilder();//获取T类的属性 Type t = typeof (T); var propertyInfos = t.GetProperties(); //遍历属性 foreach (var propertyInfo in propertyInfos) { //检查属性是否标记了特性RequireAttribute attribute = (RequireAttribute) Attribute.GetCustomAttribute(propertyInfo, typeof (RequireAttribute));//没标记,直接跳过if (attribute == null){ continue;}//获取属性的数据类型var type = propertyInfo.PropertyType.ToString().ToLower();//获取该属性的值var value = propertyInfo.GetValue(instance);if (type.Contains("system.string")){ if (string.IsNullOrEmpty((string) value) && attribute.IsRequire) validateMsg.Append(propertyInfo.Name).Append("不能为空").Append(",");}else if (type.Contains("system.int")){ if ((int) value == 0 && attribute.IsRequire) validateMsg.Append(propertyInfo.Name).Append("必须大于0").Append(",");} } return validateMsg.ToString(); }

执行验证:

static void Main(string[] args) { var obj = new Student() {Name = "" }; Console.WriteLine(CheckRequire(obj)); Console.Read(); }

结果输出:

有人会发现,Sex也标记了[Require(true)],为什么没有验证信息,这是因为,Sex没有实现属性{ get; set; },GetProperties是获取不到的

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。