zoukankan      html  css  js  c++  java
  • 反射

    注意 :在使用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 --对象关系映射,就是通过对类的达成对数据库的操作

    方法 属性 字段

    //此处代码暂未上传


    未完待续。。。。。。

     
  • 相关阅读:
    由u盘安装Ubuntu引出的事件
    初试Ubuntu
    从error 中学习
    快手一面:牛客:字符串左移
    快手一面:Leetcode:最小栈
    十三、线程池
    十二、windows临界区、其他各种mutex互斥量
    十一、std::async深入
    LeetCode(703):找出数据流中的第K大元素
    LeetCode(1003):检查替换后的字符串
  • 原文地址:https://www.cnblogs.com/netCat/p/14981072.html
Copyright © 2011-2022 走看看