反射是.NET中的重要機制,經過反射,能夠在運行時得到程序或程序集中每個類型html
(包括類、結構、委託、接口和枚舉等)的成員和成員的信息。性能
其實有些人會問, 像咱們日常引用DLL能夠直接用, 爲何要用反射?反射仍是對性能有影響的,優化
儘管能夠經過優化反射的行爲縮小之間性能的差距,可能這個時候對於性能要求毫秒級的需求, 那就要適當的取捨是否用反射。spa
(儘管對於大部分定製軟件開發來講, 軟件都是一次開發, 而後二次維護, 不多大的需求面會更改)。插件
反射最大的好處就是, 插件化, 動態可配置, 擴展性強。當面臨需求的變動亦或新增模塊的狀況,不用去改動源代碼。code
1.利用Assembly去加載DLL程序集htm
利用微軟現有的結局方案能夠實現動態加載Dll程序集, 在System.Reflection命名空間下的Assemly。對象
1.新建一個控制檯應用程序blog
2.新建一個類庫ClassLibrary, 新建兩個模型 一個Student類 , 一個School類接口
public class Student { public string name { get; set; } public string sex = ""; public void Hay() { Console.WriteLine("大家好"); } public void Hay(string name) { Console.WriteLine(name + "你好"); } public void GoodBye<T>(T name) { Console.WriteLine(name + "再見"); } private void GoodBye() { Console.WriteLine("再見"); } public static void StaticMethod() { Console.WriteLine("私有方法..."); } }
public class School { }
//利用Assembly.Load方法讀取外部的DLL程序集 【默認加載根目錄下面DLL】
//反射加載外部DLL Assembly ass = Assembly.Load("ClassLibrary"); //默認加載根目錄下面DLL
//獲取程序的Modules
//獲取全部模塊 foreach (var item in ass.GetModules()) { Console.WriteLine(item.FullyQualifiedName); }
//獲取屬性, 方法, 字段
foreach (var item in ass.GetTypes()) // { Console.WriteLine(item.FullName); //獲取DLL中全部的命名空間 foreach (var sub in item.GetProperties()) //公開屬性 { Console.WriteLine(item.Name + "公開屬性:" + sub.Name); } foreach (var sub in item.GetMethods()) //公開方法 { Console.WriteLine(item.Name + "公開方法:" + sub.Name); } foreach (var sub in item.GetFields()) //公開字段 { Console.WriteLine(item.Name + "公開字段:" + sub.Name); } }
//反射建立實例對象
foreach (var item in ass.GetTypes()) { if (item.Name.Contains("Student")) //ClassLibrary.Student { //使用Activator 動態去建立一個實例對象, 調用其中的公開方法 Student stu = (Student)Activator.CreateInstance(item); stu.Hay(); } }
//反射調用實例方法、靜態方法、重載方法、私有方法、泛型方法
foreach (var item in ass.GetTypes()) { if (item.Name.Contains("Student")) { //Student實例對象 object obj = Activator.CreateInstance(item); //實例方法 MethodInfo method = item.GetMethod("Hay", new Type[] { }); method.Invoke(obj, null); //重載方法 MethodInfo method1 = item.GetMethod("Hay", new Type[] { typeof(string) }); //帶參數Hay method1.Invoke(obj, new object[] { "哥哥" }); //靜態方法 MethodInfo method2 = item.GetMethod("StaticMethod"); method2.Invoke(null, null); //私有方法 MethodInfo method3 = item.GetMethod("GoodBye", BindingFlags.Instance | BindingFlags.NonPublic); method3.Invoke(obj, null); //泛型方法 MethodInfo method4 = item.GetMethod("GoodBye"); method4 = method4.MakeGenericMethod(typeof(string)); //重點,爲泛型聲明指定類型 method4.Invoke(obj, new object[] { "泛型," }); } }
//反射字段屬性: GetValue SetValue
foreach (var item in ass.GetTypes()) { if (item.Name.Contains("Student")) { object obj = Activator.CreateInstance(item); foreach (var sub in item.GetProperties()) { sub.SetValue(obj, "Mobike"); //SetValue Console.WriteLine(sub.GetValue(obj)); //GetValue } } }
源文: