C#编程(七十九)

时间:2021-12-16 05:09:51

在介绍翻着之前,先说两个小案例

B超:什么叫B超呢?就是透过肚皮能看到你内脏的情况,不用打开肚子才能看.这是什么样的一种技术呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了

地球内部结构:地球的内部结构大体可以分为三层:地壳、地幔和地核。地壳是固体,地核是液体,地幔则是半液半固的结构(中学地理的内容,大家还记得吧?)。如何在地球表面不用深入地球内部就知道其内部的构造呢?对,向地球发射“地震波”,“地震波”分两种一种是“横波”,另一种是“纵波”。“横波”只能穿透固体,而“纵波”既可穿透固体又可以穿透液体。通过在地面对纵波和横波的反回情况,,我们就可以大体断定地球内部的构造了

其实说这两个例子并没有什么卵用,就是想告诉你,他们都有一个共同点,就是从一个对象的外部去了解对象内部的构造,而且都是李永乐波的反射功能.在.NET中的反射也可以实现从对象的外部来了解对象(或程序集)内部结构的功能,就算比不知道这个对象(或程序集)是个什么东西,就像科学家不用刨开地球,就能知道地球的构造一样,另外.NET中的反射还可以动态的创建出对象并执行他其中的方法.

反射是.NET中重要的机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类,结构,委托,接口和枚举等)的成员的信息.有了反射,即可对每一个类型了如指掌.另外还可以直接创建对象,及时这个对象的类型在编译时还不知道.

反射的用途:

(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找烈性并创建该类型的实例.

(2)使用Moudule了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有的全区方法或其他特定的给全局方法.

(3)使用ConstructorInfo了解方法的名称,返回类型,参数,访问修饰符和实现详细信息等

(4)使用MethodInfo了解方法的名称,返回类型,参数,访问修饰符和实现详细信息(如abstract或virtual)

(5)使用FiedInfo了解字段的名称,访问修饰符和实现详细信息等,并获取或设置字段值

(6)使用EventInfo了解事件的名称,事件处理程序数据类型,自定义属性,生命类型和反射类型等,添加或移除事件处理程序.

(7)使用PropertyInfo了解属性的名称,数据类型,声明类型,反射类型和只读或可写状态等,获取或设置属性值

(8)使用ParameterInfo了解参数的名称,数据类型,是输入参数还是输出参数,一次参数在方签名中的位置等.

(需要记住吗?不需要,用的时候知道有这么一回事,能查到就行)

反射用到的命名空间:(主要有三个)

System.Reflection

System.Type

System.Reflection.Assembly

反射用到的主要类

System.Type类----通过这个类可以访问任何给定数据类型的信息

System.Feflection.Assembly----他可以用于访问给定程序集的信息,或者把这个程序集加载到程序中.

System.Type类:

System.Type类对于反射起着核心的作用.但他是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法,字段,属性来查找有关该类型的所有信息.

获取给定类型的type饮用有三种常用方式:

a.使用typeof运算符

Type t=typeof(string);

b.使用对象GetType()方法

string s=”hahaha”;

Type t=s.GetType();

c.还可以调用Type类的静态方法GetType().

Type t=Type.GetType(“”);

上面这三类代码都是获取string类型的Type,再取出string类型的Type引用t后,我们就可以通过t来探测string类型的结构了.

string n = "grayworm";

Type t = n.GetType();

foreach (MemberInfo mi in t.GetMembers())

{

Console.WriteLine("{0}\t{1}", mi.MemberType, mi.Name);

}

Type类的属性

属性名

 

说明

 

Name

 

数据类型名

 

FullName

 

数据类型的完全限定名

 

Namespace

 

定义数据类型的命名空间名

 

IsAbstract 

 

指示该类型是否是抽象类型

 

IsArray   

 

指示该类型是否是数组

 

IsClass   

 

指示该类型是否是类

 

IsEnum   

 

指示该类型是否是枚举

 

IsInterface    

 

指示该类型是否是接口

 

IsPublic 

 

指示该类型是否是公有的

 

IsSealed 

 

指示该类型是否是密封类

 

IsValueType 

 

指示该类型是否是值类型

 

Type类的方法: