反射

注意 :在使用NETCore 反射动态加载的时候 如果没有因为dll文件 使用

Assembly assembly = Assembly.LoadFrom(dllName); //dll名称 需要后缀

 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         }
View Code

反射的优点

反射可以突破方法的权限限制
反射可以破坏单例
反射可以解耦
反射的局限 : 性能不好(获取类型 消耗性能)
 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 --对象关系映射,就是通过对类的达成对数据库的操作

方法 属性 字段

//此处代码暂未上传


未完待续。。。。。。

 
posted @ 2021-07-07 13:01  .NetCat  阅读(55)  评论(0编辑  收藏  举报