C# 反射
2013-05-13 17:42 hduhans 阅读(361) 评论(0) 收藏 举报一、准备知识
了解反射之前,先了解一下.NET应用程序的基本结构:程序域(AppDomain)->程序集(Assembly)->模块(Module)->类型(Type)->成员。
① 程序域(AppDomain):存在于进程的逻辑分区中,应用程序域最大的作用就是隔离,就是将不同应用程序创建的对象进行隔离。一个进程可以有多个应用程序域。
② 程序集(Assembly):简单说,一个exe或一个dll就是一个程序集(如System.Data.dll),一个.NET应用程序可以由多个程序集拼装而成。程序集是类物理居住的地方,在程序中要使用一个类,必须告诉编译器这个类居住的地方。(命名空间只是说明一个类型是那个族的,比如有人是汉族、有人是回族;而程序集表明一个类型住在哪里,比如有人住在北京、有人住在上海;那么北京有汉族人,也有回族人,上海有汉族人,也有回族人,详见http://blog.csdn.net/tonglian/article/details/2271066)
③ 模块(Module):一个程序集包含多个模块。
④ 类型(Type):可以理解为类,一个程序集中包含多个类。
⑤ 成员:包括属性、方法、事件等。
二、反射
1、基本类型
① 加载程序集(Assembly)三种方法:Load(推荐使用)、LoadFrom(根据程序集绝对地址加载)、LoadWithPartialName(不建议使用)。此外,
AppDomain.CurrentDomain.GetAssemblies 可获得当前程序域中所有的程序集;
Assembly.GetExecutingAssembly() 可获得包含当前执行代码的程序集;
Assembly.GetEntryAssembly() 可获得应用程序入口程序集;
Assembly.GetCallingAssembly() 可获得调用当前正在执行的方法的方法的程序集;
Assembly.GetAssembly(Type type) 获取指定类的程序集。
② 加载模块(Module):Assembly.GetModules()或Assembly.GetModule(String name)
③ 加载类型(Type):Assembly.GetTypes()或Module.GetTypes(),另外加载类型还有如下途径:
1) 根据已知类(如TestClass)加载:typeof(TestClass)
2) 根据类的对象(如tc)加载:tc.GetType()
3) 根据类的路径(命名空间+类名)加载:Type.GetType("Test.TestClass")
根据类型动态创建对象:
Type t = Type.GetType("test.TestA"); TestA ta = (TestA)Activator.CreateInstance(t); //方法一 Object oa = Activator.CreateInstance(t); //方法二
④ 加载构造函数信息(ConstructorInfo):Type.GetConstructors()或Type.GetConstructor
⑤ 加载方法信息(MethodInfo):Type.GetMethods()或Type.GetMethod(),
根据配置文件加载类的某个方法:
Type t = Type.GetType("test.TestA"); Object ta=Activator.CreateInstance(t); MethodInfo m = t.GetMethod("pap"); m.Invoke(ta,new object[]{});
⑥ 加载字段信息 (FieldInfo):Type.GetFields()或Type.GetField()
⑦ 加载事件信息(EventInfo):Type.GetEvents()或Type.GetEvent()
⑧ 加载属性信息(PropertyInfo):Type.GetProperties()或Type.GetProperty()
注:属性与字段是有区别的,属性至少有一个get或set方法,字段是类内部使用的,存储数据
⑨ 加载参数信息(ParameterInfo):MethodInfo.GetParameters()
2、常用方法
① 加载接口 Type.GetInterfaces()
浙公网安备 33010602011771号