.Net中的反射
来源:互联网 发布:淘宝美工属于什么行业 编辑:程序博客网 时间:2024/06/05 05:00
在机房重构的过程中用到了反射,如工厂类、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 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
- .Net 中的反射(反射特性)
- .Net 中的反射(反射特性)
- .net中的反射机制
- 说说.NET中的反射
- .Net中的反射使用
- .NET中的反射机制
- .NET 中的反射
- Net中的反射
- .Net 中的反射(序章)
- NET Framework 中的反射
- .NET 中的反射机制
- .Net 中的反射
- .Net中的反射
- .NET中的类型反射
- .NET Framework 中的反射
- .Net 中的反射
- .Net 中的反射(反射特性) - Part.3
- .Net 中的反射(反射特性) - Part.3
- linux系统chown命令解析
- Human Gene Functions(POJ 1080)
- 2014年度总结
- XP系统下虚拟机无法通过NAT连接网络
- jvm内存
- .Net中的反射
- 前面搭建好环境后,cocos2dx3.3如何新建项目?
- Android 在线音乐播放器
- Java并发学习笔记(六)-互斥性和内存可见性
- 算法分析与设计
- 程序员转变成项目经理--1412华凌杰
- 关于一元三次方程求根
- spring配置文件中 scope="prototype" 学习笔记
- COM组件开发(四)——VC++调用COM组件的方法