还是那几句话:
学无止境,精益求精
十年河东,十年河西,莫欺少年穷
学历代表你的过去,能力代表你的现在,学习代表你的将来
看过设计模式的童鞋都知道:反射反射,程序员的快乐!今天我们就利用反射来制作打印和Excel报表导出,不过在进行案例之前,我们探讨下反射的基础知识:
借用别人博客的一个举例来描述反射:
B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况。这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不知说得是否准确^_^)。
B超利用超声波去探索人体内部的结构,反射其实和B超差不多,只不过在这里我们是利用反射去了解类的内部构造,比如类的属性,成员,方法,接口,命名空间,类的全名等
我们在使用反射前,需要引入程序集:
引入后,我们就可以进行反射的测试了,
1、首先从反射常用的 System.Type 说起,我们可以利用 System.Type 来探测类的内部接口,比如:类的属性,方法,成员,接口等
具体的用法表现为:
Type类的属性:
Name 数据类型名
FullName 数据类型的完全限定名(包括命名空间名)
Namespace 定义数据类型的命名空间名
IsAbstract 指示该类型是否是抽象类型
IsArray 指示该类型是否是数组
IsClass 指示该类型是否是类
IsEnum 指示该类型是否是枚举
IsInterface 指示该类型是否是接口
IsPublic 指示该类型是否是公有的
IsSealed 指示该类型是否是密封类
IsValueType 指示该类型是否是值类型
Type类的方法:
GetConstructor(), GetConstructors():返回ConstructorInfo类型,用于取得该类的构造函数的信息
GetEvent(), GetEvents():返回EventInfo类型,用于取得该类的事件的信息
GetField(), GetFields():返回FieldInfo类型,用于取得该类的字段(成员变量)的信息
GetInterface(), GetInterfaces():返回InterfaceInfo类型,用于取得该类实现的接口的信息
GetMember(), GetMembers():返回MemberInfo类型,用于取得该类的所有成员的信息
GetMethod(), GetMethods():返回MethodInfo类型,用于取得该类的方法的信息
GetProperty(), GetProperties():返回PropertyInfo类型,用于取得该类的属性的信息
可以调用这些成员,其方式是调用Type的InvokeMember()方法,或者调用MethodInfo, PropertyInfo和其他类的Invoke()方法。
根据上述的具体用法,我们作如下测试:
static void Main(string[] args) { //1、反射基本的类 获取属性及方法 Type type = typeof(Person); Console.WriteLine("类型名:" + type.Name); Console.WriteLine("类全名:" + type.FullName); Console.WriteLine("命名空间名:" + type.Namespace); Console.WriteLine("程序集名:" + type.Assembly); Console.WriteLine("模块名:" + type.Module); Console.WriteLine("基类名:" + type.BaseType); Console.WriteLine("是否类:" + type.IsClass); Console.WriteLine("类的公共成员(Public):"); MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员 foreach (var item in memberInfos) { Console.WriteLine(string.Format("{0}:{1}", item.MemberType, item)); } Console.WriteLine("类的公共属性(Public):"); PropertyInfo[] Propertys = type.GetProperties(); foreach (PropertyInfo fi in Propertys) { Console.WriteLine(fi.Name); } Console.WriteLine("类的公共方法(Public):"); MethodInfo[] mis = type.GetMethods(); foreach (MethodInfo mi in mis) { Console.WriteLine(mi.ReturnType + " " + mi.Name); } Console.WriteLine("类的公共字段(Public):"); FieldInfo[] fis = type.GetFields(); foreach (FieldInfo fi in fis) { Console.WriteLine(fi.Name); } Console.ReadKey(); }