.Net中的反射

来源:互联网 发布:淘宝美工属于什么行业 编辑:程序博客网 时间:2024/06/05 05:00

   在机房重构的过程中用到了反射,如工厂类、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 FunctionEnd Class
             其中Assembly.Load("程序集").CreateInstance("命名空间.类")这一句代码利用了反射。需要注意的是不管在哪一层写这段代码时,其中的("程序集")读取的实际是UI(Web)层bin文件夹下的dll,也就是说反射的类的程序集dll在UI(Web)层的bin下必须有,而且CreateInstance()一定是“命名空间.类名”,否则创建的实例为空,程序会报错。

   DataTable转化成泛型

Imports System.Collections.GenericImports 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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 平板电脑死机开不了机了怎么办 欧灵平板电脑忘记图密解锁怎么办 淘宝没货发给人被投诉了怎么办 淘宝店铺既不能开又不能注销怎么办 妻子被骗五万疑似被洗脑我该怎么办 奖虫账号和密码不匹配怎么办 开淘宝店余额宝里的钱怎么办 京东找不到所有宝贝的链接了怎么办 淘宝店链接改了标题没流量怎么办 淘宝手淘搜索自然流量少怎么办 4个月宝贝不食欲下降怎么办 淘宝商家预售时间到了不发货怎么办 淘宝修改类目被处置管控了怎么办 淘宝换手机号是已经注册了的怎么办 闲鱼违规把我淘宝店铺冻结了怎么办 开网店店主想买自己的东西怎么办 以前用微博登录头条的账号怎么办 公众号注册提示邮箱已被占用怎么办 学信网注册时出现邮箱被占用怎么办 手机淘宝店铺接不到买家消息怎么办 买了东西淘宝店铺没了怎么办 淘宝店铺直播间虚假交易违规怎么办 手机淘宝退款物流单号填错了怎么办 淘宝评价删除了卖家没有返现怎么办 想摆摊卖麻辣烫不知怎么摆怎么办 在淘宝卖东西买家退款不退货怎么办 在闲鱼网上买东西被骗了怎么办 开通花呗的手机号不用了怎么办 饿了么开业第一天没单量怎么办 淘宝新开店铺没有人来呀怎么办 刚开的淘宝店铺没有人买东西怎么办 开了一家龙虾店生意很淡怎么办? 新买的皮质小白鞋有点板脚怎么办 手机无效安装包与系统不兼容怎么办 发好的海参放进速冻后变小了怎么办 厨房地砖下面的下水管漏水怎么办? 埋在地下的暖气管漏水怎么办 安装个视频播放器视频全没了怎么办 奇迹mu圣导转职任务打不过怎么办 丈夫死后房产证过给妻子怎么办 学业与志愿活动冲突时你会怎么办