命名空間中的System.Reflection類別與 System.Type一起,可讓您取得已載入之元件及其內定義類型的相關信息,例如類別、介面和實值型別(也就是結構和列舉)。 你也可以在執行時用 reflection 建立型態實例,並呼叫和存取它們。
元件 包含模組、模組包含類型,以及類型包含成員。 反射會提供封裝組件、模組和類型的物件。 您可以使用反映來動態建立類型的實例、將類型系結至現有的物件,或從現有物件取得類型。 然後,您可以叫用類型的方法,或存取其欄位和屬性。 反射的一般用法包括下列各項:
- 使用 Assembly 來定義和載入元件、載入元件指令清單中所列的模組,以及從這個元件找出類型,並建立它的實例。
- 使用 Module 來查找包含模組及模組內類別的組件等資訊。 您也可以取得模組上定義的所有全域方法或其他特定非全域方法。
- 用來 ConstructorInfo 探索建構函式的名稱、參數、存取修飾詞(例如
public或private)和實作詳細數據(例如abstract或virtual) 等資訊。 使用 GetConstructors 的 GetConstructor 或 Type 方法來叫用特定的建構函式。 - 使用 MethodInfo 來探索方法的名稱、傳回類型、參數、存取修飾詞和實作詳細數據(例如
abstract或virtual) 等資訊。 使用GetMethods的GetMethod或Type方法來調用特定方法。 - 使用 FieldInfo 來探索欄位的名稱、存取修飾詞和實作詳細數據等
static資訊,以及取得或設定域值。 - 使用 EventInfo 來探索名稱、事件處理程式數據類型、自定義屬性、宣告類型及事件反映類型等資訊,以及新增或移除事件處理程式。
- 使用 PropertyInfo 來探索資訊,例如名稱、數據類型、宣告類型、反映的類型,以及屬性的唯讀或可寫入狀態,以及取得或設定屬性值。
- 使用 ParameterInfo 來探索參數的名稱、數據類型、參數是否為輸入或輸出參數,以及參數在方法簽章中的位置等資訊。
- 當您在 CustomAttributeData 或僅限反射的內容(.NET Framework)中工作時,使用 MetadataLoadContext 探索自訂屬性相關訊息。 CustomAttributeData 可讓您檢查屬性,而不需建立它們的實例。
命名空間的 System.Reflection.Emit 類別提供了一種專門的反射形式,讓你能在執行時建構型別。
反映也可以用來建立 類型瀏覽器,讓用戶能夠選取類型,然後檢視這些類型的相關信息。
反思有其他用途。 JScript 等語言的編譯程式會使用反映來建構符號表。 命名空間中的 System.Runtime.Serialization 類別會使用反映來存取數據,以及判斷要保存哪些欄位。 命名空間中的 System.Runtime.Remoting 類別會透過序列化間接使用反射。
反射中的運行時類型
反映提供類別,例如 Type 和 MethodInfo,表示類型、成員、參數和其他程式代碼實體。 不過,當您使用反映時,您不會直接使用這些類別,其中大部分是抽象的 (MustInherit 在 Visual Basic 中)。 相反地,您會使用 Common Language Runtime (CLR) 所提供的類型。
例如,當您使用 C# typeof 運算子 (GetType在 Visual Basic 中) 取得Type物件時,對象實際上是 。RuntimeType
RuntimeType 衍生自 Type ,並提供所有抽象方法的實作。
這些運行時間類別在 Visual Basic 中等同於 internal 和 Friend。 它們不會與其基類分開記載,因為基類檔會描述其行為。