.Net中的反射

   在机房重构的过程中用到了反射,如工厂类、DataTable转化泛型等。那么,.Net中提供的反射机制究竟是什么东东呢?下面就让我揭开她神秘的面纱。

   一、定义

   反射:.Net中获取运行时类型信息的方式。.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。在程序中使用反射时要利用.Net中的基类,如:Assembly类、Type类、Module类等。
   Assembly类可以获得正在运行的组件(DLL)信息,也可以动态的加载组件,以及在组件中查找类型信息,并创建该类型的实例。
   Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
   Module类可以获得模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

    二、作用

    1、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型
    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中反射机制就是获得信息的手段,有了这种手段,编程员可以很方便地对类进行操作。在程序中利用反射时一定要注意程序集和命名空间的使用,有时往往因为命名空间使用错误导致程序不能正常运行。
   关于反射的知识还有很多,本文着重介绍了机房中所用到的反射,若有不妥之处,请斧正。
   
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 83
    评论
.NET 反射是一种机制,可让程序在运行时动态地查看和操作程序集的元数据、类型、对象和成员。反射的主要作用是在编写代码时不需要明确知道类型的名称,而是在运行时使用这些类型。这使得编写更加通用和灵活的代码成为可能。反射包括以下组件: 1. Assembly(程序集):程序集是一个独立的代码库,通常是一个动态链接库(DLL)或可执行文件(EXE)。程序集包含类型、资源和其他元数据。 2. Type(类型):类型表示一个类、接口、值类型、枚举或委托。类型包含有关类的信息,如属性、方法、字段和事件。 3. Member(成员):成员表示类型的字段、属性、方法、事件和构造函数等元素。 通过反射,可以使用以下方法和属性来获取程序集、类型和成员的信息: 1. GetType():获取类型的 Type 对象。 2. GetTypes():获取程序集的所有类型。 3. GetAssembly():获取类型所在的程序集。 4. GetMember():获取类型指定的成员。 5. GetMembers():获取类型的所有成员。 6. Invoke():调用指定成员的方法。 7. GetCustomAttributes():获取指定成员的所有自定义属性。 使用反射可以实现许多功能,如动态创建对象、调用方法、访问成员和属性、加载和卸载程序集等。但是,由于反射会在运行时动态查找类型和成员,因此可能会导致性能问题。因此,在使用反射时需要注意性能问题。
评论 83
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值