以前我有写过一篇有关,打标签和反射的应用,主要用于类中字段的验证。下面是连接 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(反射) 应用二的更多相关文章

  1. C#基础---Attribute(标签) 和 reflect(反射) 应用

    1.Attribute的定义与作用: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Micros ...

  2. Java 基础之详解 Java 反射机制

    一.什么是 Java 的反射机制?   反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...

  3. [转] Git 基础 - 打标签

    2.6 Git 基础 - 打标签 打标签 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本节我们一起来学习如何列 ...

  4. h5标签基础 meta标签

    <meta>标签位于<head>标签里面,具体作用有如下: 1.设置网页编码 eg: <meta charset="utf-8"/>  ,//u ...

  5. js基础--浏览器标签页隐藏或显示状态 visibility详解

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 在工作中我们可能会遇到这样的需求,当浏览器切换到别的标签页或着最小化时,我们需要暂停页面上正在播放的视频或者音乐,这个需求 ...

  6. JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac

    记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...

  7. HTML&CSS基础-html标签的实体

    HTML&CSS基础-html标签的实体 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html&g ...

  8. HTML&CSS基础-meta标签

    HTML&CSS基础-meta标签 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见字符集 1>ASCII 我们知道计算机是由外国人发明的,他们当时也没有考虑到 ...

  9. HTML基础 img标签 做一个图库

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

随机推荐

  1. 使用AWS亚马逊云搭建Gmail转发服务(二)

    title: 使用AWS亚马逊云搭建Gmail转发服务(二) author:青南 date: 2014-12-31 14:44:27 categories: [Python] tags: [Pytho ...

  2. .NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象

    配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置.值得推荐的做法就是采用<.NET Core采用的全新配置系统[1]: 读取 ...

  3. Ajax 提交KindEditor的数据

    这次我是在EasyUI中使用了KindEditor的编辑器,按照官方给的代码,总是无法获取编辑器里面的值(内容),如下:         KindEditor.ready(function (K) { ...

  4. CGI与FastCGI

    当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html.事物总是不 断发展,网站也越来越复杂, ...

  5. 使用F#开发ASP.NET Core应用程序

    .NET Core 里的F# 在.NET Core刚发布时,就已经添加了对F#的支持.但因为当时F#组件还不完整,而一些依赖包并没有放在Nuget上,而是社区自己放到MyGet上,所以在使用dotne ...

  6. redis成长之路——(四)

    加强redis连接的连接池 虽然StackExchange.Redis针对连接已经做了很多工作,不过在实际应用场景中还是不够的,比如多实例的vip就会导致只能连到其中一个实例上等:本实例中的连接池只能 ...

  7. HTML基础标签

    [HTML写法标签][HTML字体段落标签][锚点][有序无序列表][表格] 一.HTML写法标签:双标签:<标签名>内容</标签名>单标签:<标签名 内容/> 二 ...

  8. 发布在即!.NET Core 1.0 RC2已准备就绪!!

    先说点废话,从去年夏天就开始关注学习ASP.NET Core,那时候的版本还是beta5,断断续续不停踩坑.一路研究到11月份RC1发布. 在这个乐此不疲的过程里,学习了很多新的东西,对ASP.NET ...

  9. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  10. Lightbox改造——支持滚轮缩放

    在做文章类型的web页时,经常会遇到要点开看大图的需求,LightBox2则是在众多产品中比较优秀的一款Jquery插件.配置就不细说了,今天我主要要分享的是:如何在点开大图后,可以通过鼠标滚轮来缩放 ...