C#编译运行原理 人类能识别的认识的C#高级语言 通过vs内置编译器编译 生成 dll或是exe(主要包含metadata+IL)然后dll或是exe 依赖 CLR/JIT 运行转变成 机器能识别的 机器码(010101)
经历两次编译过程把C#人类高级语言转变成机器码(010101)
C#高级开发之反射(Reflection)二
1 反射定义:反射是.net框架提供帮助类库,通过反射,可以在运行时获取程序或程序集中的每一个类型(包括类,结构,委托,接口,枚举等)
的成员或是成员信息并使用(即可以获取并使用程序或程序集的matadata信息)。
 1.1反射中两大类Assembly+Type类
1)使用System.Reflection.Assembly类定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
Assembly类可以获得程序集(DLL)的信息,也可以动态的加载程序集,以及在程序集中查找类型信息,并创建该类型的实例
Assembly assembly = Assembly.Load("DB.Oracle");//从当前目录加载dll(DB.Oracle即为项目类库名称)
Assembly assembly1 = Assembly.LoadFile(@"F:\StudyProject for TEST\MyReflection\DB.Oracle\bin\Debug\DB.Oracle.dll");//指定完整路径加载 可以是别的路径 本质还是指定到具体路径的Load方法
Assembly assembly2 = Assembly.LoadFrom("DB.Oracle.dll");//完整文件名称,需要带后缀 本质还是Load方法
通过Assembly获取程序集中类
Type[] t =assembly.GetTypes();//获取指定加载进来的dll中所有的类,
Type type = assembly.GetType("DB.Oracle.MyOracleHelper");//获取指定类的type信息,单独获取某个类的信息 通过该信息可以创建出对象
(2)使用System.Type 类可以访问任何给定数据类型的信息。 对于反射起着核心的作用,但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。
获取给定类型的Type引用有3种常用方式
1.使用C# typof运算符准对的是某一个类型 Type type = typeof(string)
2.使用对象GetType()方法 准对的是某一个变量 string s = "test"; Type type = s.GetType();
3.使用Type类的静态方法GetTyep() Type type =Type.GetType("System.String");
4.Type类常用方法如下:
GetConstructor(), GetConstructors():返回ConstructorInfo类型,用于取得该类的构造函数的信息(ConstructorInfo[] constructorInfos = type.GetConstructors();//获取当前Type定义的所有公共构造函数) GetEvent(), GetEvents():返回EventInfo类型,用于取得该类的事件的信息(EventInfo[] eventInfos = type.GetEvents();//返回当前Type定义或继承的所有公共事件) GetField(), GetFields():返回FieldInfo类型,用于取得该类的字段(成员变量)的信息(FieldInfo[] fieldInfos = type.GetFields();//返回当前Type所有公共的字段)
GetMember(), GetMembers():返回MemberInfo类型,用于取得该类的所有成员的信息
GetMethod(), GetMethods():返回MethodInfo类型,用于取得该类的方法的信息(MethodInfo[] methodInfo = type.GetMethods();//返回当前Type的所有公共方法)
GetProperty(), GetProperties():返回PropertyInfo类型,用于取得该类的属性的信息(PropertyInfo[] propertyInfos = type.GetProperties();//返回当前Type所有公共属性);
2 反射主要用途(dll-IL-metadata-反射),主要是获取程序集或是DLL/exe的matadate信息并使用它(加载dll,读取module、类、属性、字段、方法、特性)
2.1利用反射机制中的Activator创建对象(IOC原理:Reflection+Factory+config)

工厂示例如下:
C#高级开发之反射(Reflection)二
 1  private static string IDBHelpConfig = ConfigurationManager.AppSettings["IDBHelperConfig"];
 2         private static string DllName = IDBHelpConfig.Split(',')[0];
 3         private static string TypeName = IDBHelpConfig.Split(',')[1];
 4         public static IDBHelper CreateInstance()
 5         {
 6             Assembly assembly = Assembly.Load(DllName);//加载dll//Assembly.Load("DB.Oracle")
 7             Type type = assembly.GetType(TypeName);//获取指定类的type信息GetType("DB.Oracle.MyOracleHelper")
 8             object oDBHelper = Activator.CreateInstance(type);//创建对象
 9             IDBHelper iDBHelper = (IDBHelper)oDBHelper;//类型转换
10             return iDBHelper;
11           }
View Code

相关文章: