標籤:io ar 使用 sp 資料 on cti 代碼 bs
反射(Reflection)是.NET中的重要機制,通過放射,可以在運行時獲得.NET中每一個類型(包括類、結構、委託、介面和枚舉等)的成員,包括方法、屬性、事件,以及建構函式等。還可以獲得每個成員的名稱、限定符和參數等。有了反射,即可對每一個類型了如指掌。如果獲得了建構函式的資訊,即可直接建立對象,即使這個對象的類型在編譯時間還不知道。
程式碼在編譯後產生可執行檔應用,我們首先要瞭解這種可執行應用程式的結構。
應用程式結構分為應用程式定義域—程式集—模組—類型—成員幾個層次,公用語言運行庫載入器管理應用程式域,這種管理組件括將每個程式集載入到相應的應用程式定義域以及控制每個程式集中類型階層的記憶體布局。
程式集包含模組,而模組包含類型,類型又包含成員,反射則提供了封裝程式集、模組和類型的對象。我們可以使用反射動態地建立類型的執行個體,將類型綁定到現有對象或從現有對象中擷取類型,然後調用類型的方法或訪問其欄位和屬性。反射通常具有以下用途。
(1)使用Assembly定義和載入程式集,載入在資訊清單中列出模組,以及從此程式集中尋找類型並建立該類型的執行個體。
(2)使用Module瞭解包含模組的程式集以及模組中的類等,還可以擷取在模組上定義的所有全域方法或其他特定的非全域方法。
(3)使用ConstructorInfo瞭解建構函式的名稱、參數、存取修飾詞(如pulic 或private)和實現詳細資料(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法來調用特定的建構函式。
(4)使用MethodInfo瞭解方法的名稱、傳回型別、參數、存取修飾詞(如pulic 或private)和實現詳細資料(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法來調用特定的方法。
(5)使用FiedInfo瞭解欄位的名稱、存取修飾詞(如public或private)和實現詳細資料(如static)等,並擷取或設定欄位值。
(6)使用EventInfo瞭解事件的名稱、事件處理常式資料類型、自訂屬性、宣告類型和反射類型等,添加或移除事件處理常式。
(7)使用PropertyInfo瞭解屬性的名稱、資料類型、宣告類型、反射類型和唯讀或可寫狀態等,擷取或設定屬性值。
(8)使用ParameterInfo瞭解參數的名稱、資料類型、是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。
System.Reflection.Emit命名空間的類提供了一種特殊形式的反射,可以在運行時構造類型。
反射也可用於建立稱為類型瀏覽器的應用程式,使使用者能夠選擇類型,然後查看有關選定類型的資訊。
此外,Jscript等語言編譯器使用反射來構造符號表。System.Runtime.Serialization命名空間中的類使用反射來訪問資料並確定要永久儲存的欄位,System.Runtime.Remoting命名空間中的類通過序列化來間接地使用反射。
C#反射