.NET 中的反射
要在用 .NET Framework 编程时利用反射,您可以使用 System.Reflection 命名空间。此命名空间提供封装了很多运行时概念的类,例如程序集、模块、类型、方法、构造函数、字段和属性。
图 1 中的表显示,System.Reflection 中的类如何与概念上运行时的对应项对应起来。尽管很重要,不过 System.Reflection.Assembly 和 System.Reflection.Module 主要用于定位新代码并将其加载到运行时。本专栏中,我暂不讨论这些部分,并且假定所有相关代码都已经加载。
要检查和操作已加载代码,典型模式主要是 System.Type。通常,您从获得一个所关注运行时类别的 System.Type 实例开始(通过 Object.GetType)。接着您可以使用 System.Type 的各种方法,在 System.Reflection 中探索类型的定义并获得其它类的实例。例如,如果您对某特定方法感兴趣,并希望获得此方法的一个 System.Reflection.MethodInfo 实例(可能通过 Type.GetMethod)。同样,如果您对某字段感兴趣,并希望获得此字段的一个 System.Reflection.FieldInfo 实例(可能通过 Type.GetField)。
一旦获得所有必要的反射实例对象,即可根据需要遵循检查或操作的步骤继续。检查时,您在反射类中使用各种描述性属性,获得您需要的信息(这是通用类型吗?这是实例方法吗?)。操作时,您可以动态地调用并执行方法,通过调用构造函数创建新对象,等等。
检查类型和成员
让我们跳转到一些代码中,探索如何运用基本反射进行检查。我将集中讨论类型分析。从一个对象开始,我将检索它的类型,而后考察几个有意思的成员(请参见图 2)。
首先需要注意的是,在类定义中,乍看起来说明方法的篇幅比我预期的要多很多。这些额外的方法是从哪里来的呢?任何精通 .NET Framework 对象层次结构的人,都会识别从通用基类 Object 自身继承的这些方法。(事实上,我首先使用了 Object.GetType 检索其类型。)此外,您可以看到属性的 getter 函数。现在,如果您只需要 MyClass 自身显式定义的函数,该怎么办呢?换句话说,您如何隐藏继承的函数?或者您可能只需要显式定义的实例函数?
随便在线看看 MSDN,就会发现大家都愿意使用 GetMethods 第二个重载方法,它接受 BindingFlags 参数。通过结合来自 BindingFlags 枚举中不同的值,您可以让函数仅返回所需的方法子集。替换 GetMethods 调用,代之以:
GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly |BindingFlags.Public)
结果是,您得到以下输出(注意这里不存在静态帮助器函数和继承自 System.Object 的函数)。
Reflection Demo Example 1
Type Name: MyClass
Method Name: MyMethod1
Method Name: MyMethod2
Method Name: get_MyProperty
Property Name: MyProperty
如果您事先知道类型名称(完全限定)和成员,又该如何?您如何完成从枚举类型向检索类型的转换?有了前两个示例中的代码,您已经有了能够实现基元类浏览器的基本组件。通过名称您可以找到一个运行时实体,然后枚举其各种相关属性。
动态调用代码
迄今为止,我已经获得运行时对象的句柄(如类型和方法),仅作描述用,例如输出它们的名称。但是如何做得更多呢?如何实际调用某个方法呢?
此例的几个要点是:首先,从一个 MyClass, mc1 实例检索一个 System.Type 实例,然后,从该类型检索一个 MethodInfo 实例。最后,当调用 MethodInfo 时,通过把它作为调用的第一个参数来传递,将其绑定到另一个 MyClass (mc2) 实例中。
前面讲过,对于您预期在源代码中见到的类型和对象使用之间的区别,这个示例使这种区别变得模糊。逻辑上,您检索了一个方法的句柄,然后调用该方法,就象它属于一个不同的对象一样。对于熟悉函数式编程语言的程序员来说,这可能轻而易举;但对于只熟悉 C# 的程序员来说,要分离对象实现和对象实例化,可能就不是那么直观了。
- 用Photoshop给漂亮的烫发MM抠图
- Photoshop透明婚纱抠图大法
- Photoshop:让MM做个“变色龙”
- 用Photoshop来制作一款精美的宝宝照片墙
- Photoshop绝色美女通道抠图法
- 用Photoshop教你打造绚丽光芒效果
巧巧读书:http://www.qqread.com/aspdotnet/a396184.html
相关专题
- Office技巧专区 (7141篇文章)
- 网管实用技巧100例 (6859篇文章)
- ADO.NET实用技巧 (6387篇文章)
- .NET Framework新手入门 (132篇文章)
- .NET移动与嵌入式技术 (5963篇文章)
- .NET开发手册 (5664篇文章)
- ASP.NET教程 (8457篇文章)
- .NET框架架构 (467篇文章)
- ASP.NET应用篇 (2638篇文章)
- ASP.NET经验技巧篇 (99篇文章)
- .NET开发人员犯的6大安全错误 (6次浏览)
- 请跟我来--使用Ext搞个原型 (1次浏览)
- ASP.NET 3.5 Extensions带来什么 (1次浏览)
- 应用WEB标准会使ScrollTop属性失效! (0次浏览)
- Cache用法之缓存页面和缓存数据 (0次浏览)
- 支持正则表达式的UrlMapping (0次浏览)
- 关于ASP.NET 2.0的目录结构变化 (0次浏览)
- WPF中Closing窗体时调用Hide()方法异常 (0次浏览)
- 对象数组根据某属性列的灵活排序 (0次浏览)
- DB2 9和ASP.NET 2.0构建下一代应用程序 (0次浏览)



