1. 程式人生 > >C#的程式集和反射

C#的程式集和反射

我們所寫的所有程式碼 都會 編譯到 程式集檔案中,並在執行時以【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();