注意 :在使用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 --對象關系映射,就是通過對類的達成對資料庫的操作
方法 屬性 字段
//此處代碼暫未上傳
未完待續。。。。。。