下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 C#反射简要介绍

C#反射简要介绍.pdf

C#反射简要介绍

于是的我
2012-12-26 0人阅读 举报 0 0 暂无简介

简介:本文档为《C#反射简要介绍pdf》,可适用于IT/计算机领域

反射是net中的高级功能之一利用反射可以实现许多以前看来匪夷所思的功能。一、基本概念反射:反射是一个运行库类型发现的过程。通过反射可以得到一个给定程序集所包含的所有类型的列表这个列表包括给定类型中定义的方法、字段、属性和事件。也可以动态的发现一组给定类支持的借口、方法的参数和其他相关信息如基类、命名空间、数据清单等。还可以获得每个成员的名称、限定符和参数等。有了反射即可对每一个类型了如指掌。如果获得了构造函数的信息即可直接创建对象即使这个对象的类型在编译时还不知道。程序集包含模块而模块包含类型类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例将类型绑定到现有对象或从现有对象中获取类型。然后可以调用类型的方法或访问其字段和属性。二、命名空间SystemReflection命名空间内的各类型。Assembly:定义和加载程序集加载在程序集清单中列出的模块以及从此程序集中查找类型并创建该类型的实例。AssemblyName:通过它可以找到大量隐藏在程序集的身份中的信息如版本信息、区域信息等。ConstructorInfo:了解以下信息:构造函数的名称、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。EventInfo:事件的信息。事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等并添加或移除事件处理程序。FieldInfo:字段的信息。字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等并获取或设置字段值。MethodInfo:方法的信息。方法的名称、返回类型、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。ParameterInfo:参数的信息。参数的名称、数据类型、参数是输入参数还是输出参数以及参数在方法签名中的位置等。PropertyInfo:属性的信息。属性的名称、数据类型、声明类型、反射类型和只读或可写状态等并获取或设置属性值。MemberInfo:是抽象基类为EventInfo、FieldInfo、MethodInfo、PropertyInfo等类型定义了公共的行为。Module:用来访问带有多文件程序集的给定模块还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。SystemType类SystemType支持的成员可以分为这样几类Is***用来检查一个类型的元数据如IsAbstract、IsClass、IsValueType等等Get***用来从类型得到指定项目如GetEvent()得到类型的一个指定的事件(EventInfo)。另外这些方法都有一个单数版本和一个复数版本。如GetEvent()对应有一个复数版本GetEvents()该方法返回一个相关的EventInfo数组FindMembers()根据查询条件返回一个MemberInfo类型的数组GetType()该静态方法根据一个字符串名称返回一个Type实例InvokeMember()对给定项目进行晚期绑定得到一个Type类型实例的三种方法(因为Type是一个抽象类所以不能直接使用new关键字创建一个Type对象)使用SystemObjectGetType()。使用SystemTypeGetType()静态方法,参数为类型的完全限定名。该方法被重载允许指定两个布尔类型的参数一个用来控制当前类型不能找到时是否抛出异常另一个用来指示是否区分字符串大小写。注意到传入的字符串并没有包含类型所在的程序集信息此时该类型便被认为是定义在当前执行的程序集中的。要得到一个外部私有程序集的类型元数据时字符串参数必须使用类型完全限定名加上类型所在程序集的友好名字。嵌套类型:传入的字符串可以指定一个标记来表示一个嵌套类型如希望得到一个嵌套在person类中的枚举类型City的类型信息。使用typeof运算符。三种方法的比较:使用第一种方法必须先建立一个实例而后两种方法不必先建立实例。但使用typeof运算符仍然需要知道类型的编译时信息而使用SystemTypeGetType()静态方法,不需要知道类型的编译时信息所以是首选方法。动态调用DLL类库的流程。加载程序集。使用Assembly中的方法Load、LoadFile、LoadFrom三个函数。获得类型。使用Assembly中的方法GetType。方法GetTypes返回所有的类型。创建类型实例。有两种方式:一是调用Assembly中方法CreateInstance(有三个重载)二是调用Activator中的方法CreateInstance或CreateInstanceFrom(有多个重载版本)。获得方法。使用Type中的GetMethod方法可以得类中方法的信息。同理类中的其他成员也可以通过相应的方法得到其信息。调用方法。使用Type中的InvokeMember方法可以调用类中的成员。或者使用成员类本身的Invoke或者SetValue等方法调用自身。方法InvokeMember说明。因为我们加载程序集的目的就是为了调用其成员因此关于调用其成员用单独一节来说明。使用反射动态调用类成员需要Type类的一个方法:InvokeMember。对该方法的声明如下:参数:name:String它包含要调用的构造函数、方法、属性或字段成员的名称。可以是空字符串表示调用默认成员。invokeAttr:一个位屏蔽由一个或多个指定搜索执行方式的BindingFlags组成。访问可以是BindingFlags之一如Public、NonPublic、Private、InvokeMethod和GetField等。不需要指定查找类型。如果省略查找类型则将应用BindingFlagsPublic|BindingFlagsInstance。binder:一个Binder对象该对象定义一组属性并启用绑定而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。若为空引用(VisualBasic中为Nothing)则使用DefaultBinder。target:在其上调用指定成员的Object。args:包含传递给要调用的成员的参数的数组。返回值表示被调用成员的返回值的Object。BindingFlags枚举说明。下列BindingFlags筛选标志可用于定义包含在搜索中的成员:为了获取返回值必须指定BindingFlagsInstance或BindingFlagsStatic。指定BindingFlagsPublic可在搜索中包含公共成员。指定BindingFlagsNonPublic可在搜索中包含非公共成员(即私有成员和受保护的成员)。指定BindingFlagsFlattenHierarchy可包含层次结构上的静态成员。下列BindingFlags修饰符标志可用于更改搜索的执行方式:BindingFlagsIgnoreCase表示忽略name的大小写。BindingFlagsDeclaredOnly仅搜索Type上声明的成员而不搜索被简单继承的成员。可以使用下列BindingFlags调用标志表示要对成员采取的操作:CreateInstance表示调用构造函数。忽略name。对其他调用标志无效。InvokeMethod表示调用方法而不调用构造函数或类型初始值设定项。对SetField或SetProperty无效。GetField表示获取字段值。对SetField无效。SetField表示设置字段值。对GetField无效。GetProperty表示获取属性。对SetProperty无效。SetProperty表示设置属性。对GetProperty无效。三、例子。得到类的各项成员信息。下面是一个实例简单的运用了前面介绍的知识实现了对一个Type对象的反射包括反射其所有可见字段、方法、属性、事件。反射类型的基本属性。并将其中一个方法的详细信息列了出来加入引用。加入人的基类。加入关于人的类。加入显示类信息方法。这些方法和Main方法同属性Program类(C#程序默认的入口类)程序入口Main函数。利用C#反射动态编译代码创建类的实例并调用其成员下面的程序在运行时生成了一个dll类库并用反射技术调用其中的一个方法然后和原始方法对比一下性能。添加引用。在Main函数中加入代码。加入测试类程序运行结果是直接输出的方法有较大的性能优势。利用反射调用类库方法性能上不占优势主要是因为要进行写文件和编译的工作(本例)但是后面的方法会对性能进行优化到最后一个方法时性能会有大幅提高但是最后一种方法的实用性不如前两种。利用反射调用已存在类库的方法一个简单的类库代码然后编译成dll文件。用反射的方法获得对该类库方法的使用上面例子虽小但具备反射技术调用类库方法的基本步骤:加载程序集。获得类型。创建类型实例。获得方法。调用方法。又一个简单例子。这个例子和上面例子差不多但功能稍微丰富一些多了一些调用方法的选项。新建一个类库test,代码如下。加入测试代码。上述的例子增加了对实例方法、静态方法、无参方法的调用。简单的反射例子。又一个简单的反射例子仅当作参考吧。创建一个DLL。创建测试类。与Main同一个工程或同一个文件。在Main函数中可以输入以下代码:较为复杂的反射例子。这个例子给出了使用各个类成员的方法还是有比较大的参考价值。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/19

C#反射简要介绍

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利