Assembly assembly = Assembly.LoadFrom(dllName); //dll名称 需要后缀
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public static string ReflictionConfig = GetConfig("ReflictionConfig"); 2 3 /// <summary> 4 /// Core 读取配置文件 :appsettings.json 属性设置[始终复制] 5 /// 1. Microsoft.Extensions.Configuration; 6 /// 2. Microsoft.Extensions.Configuration.Json; 7 /// </summary> 8 /// <param name="key"></param> 9 /// <returns></returns> 10 public static string GetConfig(string key) 11 { 12 var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json"); 13 IConfigurationRoot root = builder.Build();//建造者模式 14 string Valuestr = root.GetSection(key).Value; 15 return Valuestr; 16 } 17 18 public static IDBHelper CreateInstance() 19 { 20 string typename = ReflictionConfig.Split(',')[0];// 21 string dllName = ReflictionConfig.Split(',')[1]; 22 //Assembly assembly = Assembly.Load(dllName); 23 Assembly assembly = Assembly.LoadFrom(dllName); 24 Type type = assembly.GetType(typename); 25 object obj = Activator.CreateInstance(type); 26 return obj as IDBHelper; 27 }
反射的优点
反射可以突破方法的权限限制
反射可以破坏单例
反射可以解耦
反射的局限 : 性能不好(获取类型 消耗性能)
Assembly assembly = Assembly.Load("AspNetCore.DB.SqlServer");//DLL名称,不需要后缀 ///2.获取类型 Type type = assembly.GetType("AspNetCore.DB.SqlServer.sqlServerHelper"); ///3.创建对象 object obj = Activator.CreateInstance(type); //obj.query();//不能使用query 因为类型是Object声明的,在C#语言中,变量的声明是在编译是决定,因为是Object ,所以不能调用 //dynamic dobj = Activator.CreateInstance(type);//动态类型, dynamic是运行是决定,可以避开编译器的检查 //dobj.query(); //dobj.get(); //类型转换 IDBHelper iDBHelper = obj as IDBHelper;
//实例化泛型方法 public void Show<T,W>(T t,W w){} MethodInfo show =type.GetMethod("Show");//Show方法名称 获取 type类的Show方法 Object Test =Actiovator.CreatInstance(type);//创建对象 //注意:需要制定泛型方法的泛型类型 MethodInfo show1= show.MakeGenericMethod(new Type[](typeof(int),typeof(string))); Show1.Invoke(Test,new Object[]{123,"参数"});//如果是泛型方法,需要先确定类型,在执行方法,注意:指定的类型 和传入的参数类型必须匹配
//实例化泛型类 public class Test<T,W>{ public void show <T,W>(){} } Assembly assembly =Assembly.LoadFrom("dllName.dll");//dll名称 Type type =assembly.GetType("dllName.Test`2"); type.MakeGenericType (new Type[]{typeof(int),typeof(string)}); MethodInfo show =type.GetMethod("Show");
反射 应用于那些框架
IOC框架; 反射+配置文件+工厂==IOC框架中的应用
反射--MVC
dll type 就可以创建对象 type可以获取到Method=Method名称--字符串 dll名称+类名称+方法名称===可以调用这个方法 MVC中调用方法就是反射
反射在ORM中的 应用
ORM --对象关系映射,就是通过对类的达成对数据库的操作
方法 属性 字段
//此处代码暂未上传
未完待续。。。。。。