一、反射获取程序集的三种方式
- Assembly assembly = Assembly.Load(“YourDLLNameSpace”);
注意需要首先添加该项目的项目引用,这种方式只需要提供程序集的名称即可。 - Assembly assembly = Assembly.LoadFile(“Path”);
path为该dll所存在的根目录,这种方式需要提供程序集的完整的路径
根目录的获取方法 string path = AppDomain.CurrentDomain.BaseDictory+“YourDLL.dll”; - Assembly assembly = Assembly.LoadForm(“YourDLL.dll”);
这种方式需要提供程序集的名称及后缀名
二、获取类型
1.assembly.GetType(); //获取所有的类型
2.assembly.GetType(“命名空间.类名”) ;// 获取指定的类型
三、获取类下面的具体属性、方法、字段
Type type = assembly.GetType("MyFilesOper.test");
PropertyInfo[] properties = type.GetProperties(); //属性
FieldInfo[] fieldInfos = type.GetFields(); //字段
MethodInfo[] methodInfo = type.GetMethods(); //方法
四、实例化(多态的使用)
使用多态的特性,来实例化反射所创建的实例
以下为Msql数据库和SqlServer数据库在项目中,通过反射进行调用,然后两个数据库Helper类都继承自IDBManger,通过实例化IDBManager从而实现对内部的方法调用。将不同数据库的程序集,以及类名储存至配置文件中,从配置文件中读取,实现不同数据库的相互切换
string dllName= ConfigurationManager.AppSettings["DBType"].Split('|')[0];
string className= ConfigurationManager.AppSettings["DBType"].Split('|')[1];
Assembly assembly = Assembly.LoadFrom(dllName);
IDBManager manager = (IDBManager)assembly.CreateInstance(className);
string res = manager.ReturnMsg();
Console.WriteLine(res);
当实例化带有参数的构造函数的时候,如果直接在类中增加一个构造函数的话在使用CreateInstance时会报错,这时需要使用到关键字params 这个关键字后面跟的字符长度是可以变化的,可传也可以不传,需要注意的是,如果存在多个参数的话,用parmas修饰的参数需要放在最后一个参数中。