C#基础---Attribute(标签) 和 reflect(反射) 应用二
以前我有写过一篇有关,打标签和反射的应用,主要用于类中字段的验证。下面是连接 C#基础---Attribute(标签) 和 reflect(反射) 应用。 这个项目迭代发现公司项目里面发现老代码对业务扩展比较大的地方又通过打标签和反射做了一个小的框架,感觉挺实用的。于是想一想模仿一下就搬到博客园上。写得可能不好,也请各位博友指点.
背景: 【为了方便,自己还是模拟一个背景吧, 感觉不是很恰当,不过自己的Demo里面自己这样写的.当然跟公司的比起来肯定不够完善】
每个人都会吃饭,可是每个国家吃饭的习惯不一样。中国人吃汤圆,加拿大人吃意大利面,美国人吃火鸡。还有其他国家的人吃其他东西。如何来维护不同国家的不同习俗呢。我开了一家饭店,目前有中国,美国,加拿大的食物,如果来了一个人,我们如何让程序自动通过该人的国籍,来判断他是要吃什么呢。 这就要靠打标签和反射来解决了。下面来看Demo吧.
1.实体类.
首先我们定义一个基类,Person基类里面定义虚拟方法,每个人都会吃东西。
Person(Country=PersonCountry.UNKnown)]
public class Person
{
public virtual void Eat()
{
Console.WriteLine("我们吃东西");
}
}
再次,不同国家的人, 去继承基类,重写eat方法,体现不同国家的吃饭习惯.
[Person(Country=PersonCountry.USA)]
public class USA : Person
{
public override void Eat()
{
Console.WriteLine("我们吃火鸡");
}
} [Person(Country=PersonCountry.China)]
public class Chinese : Person
{
public override void Eat()
{
Console.WriteLine("我们吃汤圆");
}
} [Person(Country=PersonCountry.USA)]
public class USA : Person
{
public override void Eat()
{
Console.WriteLine("我们吃火鸡");
}
}
2.标签
为了区分每一个类具体是哪个国家的人,我们设置了一个Person标签,和PersonCountry枚举
public class PersonAttribute:Attribute
{
private PersonCountry _country = PersonCountry.UNKnown;
public PersonCountry Country
{
get
{
return _country;
}
set
{
this._country = value;
}
} } public enum PersonCountry
{
USA,
China,
Canada,
UNKnown
}
3. Helper方法:
实体类和枚举已经定义好。 那如何让程序自动区分,人的国籍,然后确认他们的吃饭习惯呢。下面可以通过反射来判断.
A. Assembly.GetExecutingAssembly() 可以获取当前的程序级,assembly.GetTypes() 获取所有的类型,包括USA,Canda,Chinese 信息
B. (PersonAttribute)Attribute.GetCustomAttribute(currentType, typeof(PersonAttribute));获取当前类的标签,然后用标签与传进来的countryType进行比较,确认Person类型.
C. 然后通过InvokeMember来创建对象,返回
public class PersonHelper
{
public static Person GetPersonObj(PersonCountry contryType)
{
Assembly assembly = Assembly.GetExecutingAssembly();
Type[] typeList = assembly.GetTypes(); foreach (Type currentType in typeList)
{
var attribute = (PersonAttribute)Attribute.GetCustomAttribute(currentType, typeof(PersonAttribute)); if (attribute!=null && attribute.Country == contryType)
{
return currentType.InvokeMember(null, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { }) as Person;
}
} return new Person();
}
}
4. 测试方法:
可能前面大家迷迷糊糊,下面来看看测试,可能会比较明白:
Note: 1. 如果新进来的人,是中国人,只需要调用Helper方法然后获取到Chinese对象,然后执行对应的eat方法。
2. 如果本店想知道韩国人的吃饭习惯,只需要多增加一个类,然后打上对应的标签就OK了。
public static void Main(string[] args)
{
Person p1 = PersonHelper.GetPersonObj(PersonCountry.China);
p1.Eat(); //输出:我们吃汤圆 Person p2 = PersonHelper.GetPersonObj(PersonCountry.Canada);
p2.Eat(); //输出:我们吃意大利面
}
5.总结:
本博客描述的例子很牵强,不过只是感觉这种想法还是不错的。方便项目的扩展。希望对大家有用。同时也是自己为了回顾一下反射和打标签的用法,才打算写这篇博客的。
C#基础---Attribute(标签) 和 reflect(反射) 应用二的更多相关文章
- C#基础---Attribute(标签) 和 reflect(反射) 应用
1.Attribute的定义与作用: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Micros ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
- [转] Git 基础 - 打标签
2.6 Git 基础 - 打标签 打标签 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本节我们一起来学习如何列 ...
- h5标签基础 meta标签
<meta>标签位于<head>标签里面,具体作用有如下: 1.设置网页编码 eg: <meta charset="utf-8"/> ,//u ...
- js基础--浏览器标签页隐藏或显示状态 visibility详解
欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 在工作中我们可能会遇到这样的需求,当浏览器切换到别的标签页或着最小化时,我们需要暂停页面上正在播放的视频或者音乐,这个需求 ...
- JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac
记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...
- HTML&CSS基础-html标签的实体
HTML&CSS基础-html标签的实体 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html&g ...
- HTML&CSS基础-meta标签
HTML&CSS基础-meta标签 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见字符集 1>ASCII 我们知道计算机是由外国人发明的,他们当时也没有考虑到 ...
- HTML基础 img标签 做一个图库
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
随机推荐
- 3. SVM分类器求解(1)——Lagrange duality
先抛开上面的二次规划问题,先来看看存在等式约束的极值问题求法,比如下面的最优化问题: 目标函数是f(w),下面是等式约束.通常解法是引入拉格朗日算子,这里使用来表示算子,得到拉格朗日公式为 是等式约束 ...
- springmvc+jpa实现分页的两种方式
1.工具类 public final class QueryTool { public static PageRequest buildPageRequest(int pageNumber, int ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(3)-漂亮系统登陆界面
系列目录 前言 本文于2016-10修改 这次的代码是基于上一节的代码集成的,素材都在第二节里头 本次添加登录页面的控制器即可 实现 添加Account的Index视图: @{ Layout = nu ...
- ITTC数据挖掘平台介绍(四) 框架改进和新功能
本数据挖掘框架在这几个月的时间内,有了进一步的功能增强 一. 超大网络的画布显示虚拟化 如前几节所述,框架采用了三级层次实现,分别是数据,抽象Node和绘图的DataPoint,结构如下: ...
- isEmpty和isBlank的区别
isEmpty 判断某字符串是否为空,为空的标准是 str==null或 str.length()==0 StringUtils.isEmpty(null) = true StringUtils.i ...
- Http压测工具wrk使用指南
用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...
- WebSocket异常 通常每个套接字地址(协议/网络地址/端口)只允许使用一次
websocket的实例:http://blog.csdn.net/for_cxc/article/details/51500185 问题: 新建一个连接通信没有问题,但是如果关闭再建立就会报错:通常 ...
- HTML5新增及移除的元素
HTML经过10多年的发展,其元素经历了废弃与不断重新定义的过程.为了更好的处理现在的互联网应用,HTML5新增了图形绘制.多媒体播放.页面结构.应用程序存储.网络工作等新元素.http://hove ...
- Servlet3.0的异步
servlet之前的操作同时同步的,就是按照这样的一个流程来走的: 1.请求根据一个路径路由到一个servlet中, 2.servlet获取一系列的参数 3.执行一系列的逻辑(花费时间所占的比重也更大 ...
- Redis(li)
一.Redis基础介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset ...