天天看點

反射

注意 :在使用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 --對象關系映射,就是通過對類的達成對資料庫的操作

方法 屬性 字段

//此處代碼暫未上傳

未完待續。。。。。。