在机房重构的过程中用到了反射,如工厂类、DataTable转化泛型等。那么,.Net中提供的反射机制究竟是什么东东呢?下面就让我揭开她神秘的面纱。
一、定义
反射:.Net中获取运行时类型信息的方式。.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。在程序中使用反射时要利用.Net中的基类,如:Assembly类、Type类、Module类等。
Assembly类可以获得正在运行的组件(DLL)信息,也可以动态的加载组件,以及在组件中查找类型信息,并创建该类型的实例。
Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
Module类可以获得模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
二、作用
1、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型
2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
3、反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。
2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
3、反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。
三、应用
机房重构中在工厂类和DataTable类型到泛型的转化都用到了反射,下面看看在机房中是怎样应用反射的。
创建对象
在工厂类中利用反射创建D层中类的实例,代码如下:
Imports System.Reflection
'/*************************************************
'类名:CreareUser
'作者:孟浩杰
'说明:创建D层中UserImpl类的实体
'创建日期:2015-02-04
'版本号:机房收费系统1.0
'**********************************************/
Public Class CreateUser
'定义userDAO变量,类型为IDAO.IUser
Dim userDAO As IDAO.IUser
'定义成员函数ProduceUser()方法
Public Function ProduceUser() As IDAO.IUser
'利用反射创建实体
userDAO = CType(Assembly.Load("DAL").CreateInstance("DAL.UserImpl"), IDAO.IUser)
'返回UserImpl类的实体
Return userDAO
End Function
End Class
其中Assembly.Load("程序集").CreateInstance("命名空间.类")这一句代码利用了反射。需要注意的是不管在哪一层写这段代码时,其中的("程序集")读取的实际是UI(Web)层bin文件夹下的dll,也就是说反射的类的程序集dll在UI(Web)层的bin下必须有,而且CreateInstance()一定是“命名空间.类名”,否则创建的实例为空,程序会报错。
DataTable转化成泛型
Imports System.Collections.Generic
Imports System.Reflection
'************************************************************
'类名称:EntityHelper
'命名空间:Entity
'功能:实现datatable类型对实体的转换功能
'创建时间:2015-2-14
'作者:孟浩杰
'小组:**
'**************************************************************
Public Class EntityHelper
''' <summary>
''' 将dataTable中的数据转换为实体集合
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="dt"></param>
''' <param name="ts"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ConvertToList(Of T As New)(dt As DataTable, ts As IList(Of T))
'获得T的类型
Dim type As Type = GetType(T)
'定义一个临时变量
Dim strTemp As String = String.Empty
'遍历表中所有行数
For Each dr As DataRow In dt.Rows
'定义类型变量act获取动态创建对象T的类型。
Dim act As T = If((Nothing Is Nothing), Activator.CreateInstance(Of T)(), Nothing)
'引用反射表示可获得对象的所有属性组成的集合
Dim propertys As PropertyInfo() = act.[GetType]().GetProperties()
System.Type 类对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。在DataTable类型转化成泛型中用到了GetProperties()方法,其作用是返回PropertyInfo类型,用于取得该类的属性的信息。
总结
.Net中反射机制就是获得信息的手段,有了这种手段,编程员可以很方便地对类进行操作。在程序中利用反射时一定要注意程序集和命名空间的使用,有时往往因为命名空间使用错误导致程序不能正常运行。
关于反射的知识还有很多,本文着重介绍了机房中所用到的反射,若有不妥之处,请斧正。