[开发故事]第四回:应用反射在运行时动态获取类型信息
引言 网友hbfly,对于我在[你必须知道的.NET]第三十回:.NET十年(下)一文中 关于“当应用attribute进行运行时反射”的论述,希望举例说明,他提出了自己 的想法:[你必须知道的.NET]第二十四回:认识元数据和IL(上)[你必须知道的.NET]第二十五回:认识元数据和IL(中)[你必须知道的.NET]第二十六回:认识元数据和IL(下)
我的回答是:当然可以了:-)那么,关于怎么做,就是个小问题。 呵呵,那么我们就一个小例子来技术如何在运行时通过反射获取MyAttribute 中的字符串信息。 实现 既然是在运行时动态获取信息,那么这意味着我们可以通过反射获取任何类型 信息,包括:Type、MethodInfo、PropertyInfo、FieldInfo、ParameterInfo都 是可以手到擒来的。通过反射如何获取,而这些信息如何而来,我用三篇文章对 此进行过详细的论述: [你必须知道的.NET]第二十四回:认识元数据和IL(上) [你必须知道的.NET]第二十五回:认识元数据和IL(中) [你必须知道的.NET]第二十六回:认识元数据和IL(下) 有兴趣可以参考一下。 所以,动态获取类型信息,是反射的拿手好戏,为了做以简单的说明,我就针 对hbfly提出的问题实现一个解决方案,首先实现一个自定义的TextAttribute:
其中定义了一个Text字段用于标记在运行时获取的信息,例如:
那么,我们的目的就是在运行时动态获取为Hello类标识的“Hello, Anytao” 信息。 为了应用的简单性,我打算对object进行扩展,实现一个GetText扩展方法, 在实际的应用中,除特殊情况不建议对object实现扩展,否则将造成全局性的扩 展,对于框架而言并非好事儿。好了,我们继续,看看如何在扩展方法中应用反 射来实现想要的动态效果:
哈哈,大功告成。其实对hbfly而言,最重要的关注就在于通过反射的手段实 现对于Attribute信息的读取,在我们的示例中,就是通过GetCustomAttributes 方法来实现的。同样的道理,在Type类中还定义了很多的方法应用在不同的目标 元素上,例如: GetEvents/GetEvent GetConstructors/GetConstructor GetFields/GetField GetGenericArguments GetInterface GetMembers/GetMember GetMethods/GetMethod GetNestedTypes/GetNestedType GetProperties/GetProperty …… 有了自定义的TextAttribute,有了对于object的扩展方法GetAttributeText ,我们就可以实现动态获取类型信息的目标了:
不信,你运行试试。 结论 一个简单的技巧,一个补充的说明(对hbfly老兄的)。反射的能量是强大的 ,强大到我们可以轻而易举的对元数据信息进行读取和操作,正是如此很多基于 Attribute和Reflection的巧妙设计就油然而生了。例如,在我的项目中就通过定 义Attribute来实现实体类的string属性在get/set时统一进行Trim操作,保证了 提交数据没有冗余,同时不必在其他地方来特别关注实现对于string.Trim()的调 用。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |