C#的程式集和反射
阿新 • • 發佈:2018-12-17
我們所寫的所有程式碼 都會 編譯到 程式集檔案中,並在執行時以【Assembly物件】 方式 載入 到記憶體中執行。
為什麼要載入到記憶體?因為2原因:讀取快,執行編譯快;不需要每次讀取硬碟程式集裡的il程式碼,然後解析語法。
程式集的組成
程式集: *.exe , *.dll -> 載入到記憶體中 就是 Assembly物件
類:每個 class , interface -> 載入到記憶體中 就是 Type物件
類的成員:方法,欄位,屬性,事件等 -> 載入到記憶體中也有相應的物件
重點名稱空間:System.Reflection
反射概念:
1.在程式執行時,(動態獲取類或物件的資訊)
動態 獲取 載入程式集(Assmebly)
動態 獲取 型別(如類、介面 等) - Type物件
動態 獲取 型別的成員 資訊(如方法,欄位,屬性等);
2.在執行時,動態建立型別例項(new),以及 呼叫 和 訪問 這些 例項 成員;
.Net反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為.Net的反射機制。
.Net反射機制主要提供了以下功能: 在執行時判斷任意一個物件所屬的類;在執行時構造任意一個類的物件;在執行時判斷任意一個類所具有的成員變數和方法;在執行時呼叫任意一個物件的方法;
//通過反射獲得程式集的方式: //1.獲取當前正在執行的程式集 //1.1通過當前物件獲取 型別 所屬的程式集 Assembly ass1 = this.GetType().Assembly; //1.2通過靜態方法獲取正在執行的程式集 Assembly ass2 = Assembly.GetExecutingAssembly(); S02BLL.Person p = new S02BLL.Person(); //2.根據當前【應用程式域】獲取 程式集 Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies(); //3.根據指定的程式集路徑載入程式集 Assembly ass3 = Assembly.LoadFrom(@"F:\DelegateEvent.dll"); //通過反射型別物件 Type 的方式: //1.*通過typeof 獲取 類 對應的型別物件 Type t1 = typeof(Model.Student); //2.*通過物件 的 GetType方法 -- GetType方法 來自 Object 類! Model.Student stu = new Model.Student(); Type t2 = stu.GetType(); Type t3 = this.GetType(); //3.通過 程式集 獲取類 Assembly curAss = Assembly.GetExecutingAssembly(); //this.GetType().Assembly //*獲取程式集裡 指定名稱 的 型別物件 注意:必須寫類的全名稱! Type t4 = curAss.GetType("S01GenericAndReflection.Model.Student"); //獲取程式集裡所有的型別物件 Type[] types = curAss.GetTypes(); //獲取程式集裡 所有 公共的 型別物件 Type[] publicTypes = curAss.GetExportedTypes();