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