[开发故事]第四回:应用反射在运行时动态获取类型信息

引言

网友hbfly,对于我在[你必须知道的.NET]第三十回:.NET十年(下)一文中 关于“当应用attribute进行运行时反射”的论述,希望举例说明,他提出了自己 的想法:[你必须知道的.NET]第二十四回:认识元数据和IL(上)[你必须知道的.NET]第二十五回:认识元数据和IL(中)[你必须知道的.NET]第二十六回:认识元数据和IL(下)

[MyAttribute("text.....")]
public mymethod()
{
   //我可以再方法内部得到attrib的text吗?
}

我的回答是:当然可以了:-)那么,关于怎么做,就是个小问题。

呵呵,那么我们就一个小例子来技术如何在运行时通过反射获取MyAttribute 中的字符串信息。

实现

既然是在运行时动态获取信息,那么这意味着我们可以通过反射获取任何类型 信息,包括:Type、MethodInfo、PropertyInfo、FieldInfo、ParameterInfo都 是可以手到擒来的。通过反射如何获取,而这些信息如何而来,我用三篇文章对 此进行过详细的论述:

[你必须知道的.NET]第二十四回:认识元数据和IL(上)

[你必须知道的.NET]第二十五回:认识元数据和IL(中)

[你必须知道的.NET]第二十六回:认识元数据和IL(下)

有兴趣可以参考一下。

所以,动态获取类型信息,是反射的拿手好戏,为了做以简单的说明,我就针 对hbfly提出的问题实现一个解决方案,首先实现一个自定义的TextAttribute:

// Release : code01, 2009/05/12
// Author : Anytao, http://www.anytao.com
[AttributeUsage(AttributeTargets.Class, Inherited = false,  AllowMultiple = false)]
public sealed class TextAttribute : Attribute
{
   private readonly string text;

   public TextAttribute(string text)
   {
     this.text = text;
   }

   public string Text
   {
     get { return this.text; }
   }
}

其中定义了一个Text字段用于标记在运行时获取的信息,例如:

// Release : code02, 2009/05/12
// Author : Anytao, http://www.anytao.com
[Text("Hello, Anytao")]
public class Hello
{
}

那么,我们的目的就是在运行时动态获取为Hello类标识的“Hello, Anytao” 信息。

时间: 2024-11-05 12:12:51

[开发故事]第四回:应用反射在运行时动态获取类型信息的相关文章

[开发故事]第三回,实现集合类Sort自定义排序

对集合元素进行排序是经常发生的事情,事实上大部分的集合类型都默认实现 了Sort方法,进行其元素的排序操作.例如List<T>集合的Sort方法有: public void Sort(); public void Sort(Comparison<T> comparison); public void Sort(IComparer<T> comparer); public void Sort(int index,int count,IComparer<T> c

[开发故事]第五回,用想要的域名运行你的本地Web应用

作为Web开发者,在本地部署应用,我们都对localhost有无限的熟悉,也有无限的无奈.不管什么情况下,不同的应用都被冠以localhost:XXXX的地址,好像有性格的Web应该,都只有张三.李四这样的称呼.很多情况下,我们可能想有更个性的url来代表不同的应用,那么没有域名或者不想劳神DNS解析的情况下,让部署于本地的应该,有一个好听的url是不错的想法.那么,我们就不妨来试试. 主要的工作包括两个基本的简单步骤: 配置本机Host 在IIS中配置WebSite 配置本机的Host服务 默

艾伟_转载:[一步一步MVC]第四回:漫谈ActionLink,有时“胡搅蛮缠”

本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [一步一步MVC]第三回:MVC范例大观园 [一步一步MVC]第四回:漫谈ActionLink,有时"胡搅蛮缠" [一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper [一步一步MVC]第六回:什么是MVC(上)? MVC时代来临了,但是一开始是不被很多人接受的.可能

微信公众号开发之授权获取用户信息

微信开发交流群:148540125 系列文章参考地址 极速开发微信公众号 欢迎留言.转发 项目源码参考地址 点我点我–欢迎Start 前几篇文章已讲完如何导入项目,如何启动配置项目,如何成为开发者,重源码分析消息是如何交互.如何自定义菜单(如果以上不是很清楚可以看这里 极速开发微信公众号.这篇文章就来聊聊授权获取用户信息 一.什么是OAuth2.0 这里整理了一篇文章 理解OAuth2.0 二.微信公众平台OAuth2.0授权详细步骤 用户关注微信公众账号(现在也可以不关注). 微信公众账号提供

[开发故事]第一回:用简单方式,实现多个可执行文件的合并和执行?

写了很多的关于.NET Framework探讨的文章,偶尔也可以换个口感,本文就算 是这个方向的一个起点,从实践和应用的角度将个别有意思的体会加以分享.简 单也罢,深入也罢,对我来说都是开发中的一个个鲜活的故事,记录下来就是一 种积累. 既然是开发故事,我就不想写得枯燥,让人读者厌烦.因为有太多的枯燥学本 让我感觉无聊,所以[开发故事]就以故事的形式来阐述技术应用的一个个问题. 大部分情况下,我都想将问题简单化处理,拐弯抹角并非真正好的作品,而真正 的企业级应用则可以在此基础上举一反三. 让更多

JavaScript使用DeviceOne开发实战(四)仿优酷视频应用_javascript技巧

大家没有进行开发之前首先需要考虑系统的差异性,比如说IOS手机有没有回退键,所以在开发时一定要考虑二级解密需要有回退键,否则ios的手机就会陷入到这个页面回不去. 安卓系统有回退键,针对这个情况需要要求用户在3秒钟之内连续按回退键两次才退出系统,以此防止用户误按回退键,具体代码实现如下: [mw_shl_code=javascript,true]page.on("back", function(){ if (canBack) { global.exit(); } else { nf.t

使用 CodeIgniter 框架快速开发 PHP 应用(四)

原文:使用 CodeIgniter 框架快速开发 PHP 应用(四)使用 CI 简化数据库开发 你学习CI 是因为你想要使编程更容易和更有生产力.这一章讲述CI的Active Record类. 如果CI只提供一个Active Record类,它还是物超所值的.当然,CI是免费的,只不过我要强调Active Record(以后简称AR)类的价值是非常高的,它是你提高生产力的主要工具. AR使你以最小的代价获得最大的回报. 它简单,易于使用和维护. 这一章描述CI如何连接到一个数据库,你如何使用AR

第十四回(二):外战折戟再图雪耻 石路徜徉终是难忘【林大帅作品】

(二)第十四回:外战折戟再图雪耻 石路徜徉终是难忘 单说这第二日课上,林二便被众人嘲笑,都说不该让哲理占了便宜.这功课输人,骑射输人,这蹴球万不可再输.刘鹏,凯宏等都调笑所丢一城,势必林二通敌所致.阿四便道:"非也,此乃阿海乌龙球,"林二并不理会,只看那<体坛>里欧洲战报.不意这"乌龙"二字从此便流传了出来,所熟识的,皆呼此号.林二哭笑不得,只得接受这外号,日后费了半天劲跟莉莉解释这名号.忽见那廊前,一高三学长,与阿仁闲语.林二便知这明日文会内战,当日学

我心中的核心组件(可插拔的AOP)~第四回 异常拦截器

之前说过有关拦截器的文章,第二回  缓存拦截器,事实上,在那讲里说的最多是AOP和缓存组件,对于拦截的概念并没有详细的说明,这一讲,不说AOP,主要说一下拦截器,拦截器Interception,主要是在方法执行前或者执行后,动态添加一些行为,而这个行为主要包含缓存,日志,异常处理及你可以想到的所有的一切,呵呵. 这一讲是异常拦截器,它的主要意义在于,当你的一个方法被执行时,你可以通过配置文件去管理这个方法执行前与执行后是否附加统一异常处理行为. 拦截器组件我们还是用Unity.Intercept