.NET 中的反映

System.Reflection 命名空間的類別,連同 System.Type,可讓您取得已載入組件和其中所定義類型的資訊,例如類別介面和實值型別 (也就是結構列舉)。 您也可以使用反映在執行階段建立類型執行個體,並叫用和存取它們。 如需反映特定層面的主題,請參閱此概觀結尾的相關主題

Common Language Runtime 載入器會管理應用程式定義域,這會在有相同應用程式範圍的物件周圍構成定義的界限。 這個管理包含載入每個組件至適當的應用程式定義域和控制每個組件內類型階層的記憶體配置。

組件包含模組、模組包含類型,而類型包含成員。 反映提供封裝組件、模組和類型的物件。 您可以使用反映來動態建立類型的執行個體、繫結類型至現有的物件,或從現有的物件取得類型。 然後,您可以叫用類型的方法或存取其欄位和屬性。 反映的一般用法包含下列幾項:

  • 使用 Assembly 來定義和載入組件,載入列在組件資訊清單中的模組,然後從這個組件中尋找類型並建立它的執行個體。

  • 使用 Module 來探索資訊,例如包含模組的組件以及模組中的類別。 您也可以取得所有全域方法,或在模組上所定義的其他特定非全域方法。

  • 使用 ConstructorInfo 來探索資訊,例如名稱、參數、存取修飾詞 (例如 publicprivate),以及建構函式的實作詳細資料 (例如 abstractvirtual)。 使用 TypeGetConstructorsGetConstructor 方法來叫用特定的建構函式。

  • 使用 MethodInfo 來探索資訊,例如名稱、傳回類型、參數、存取修飾詞 (例如 publicprivate),以及方法的實作詳細資料 (例如 abstractvirtual)。 使用 TypeGetMethodsGetMethod 方法來叫用特定的方法。

  • 使用 FieldInfo 來探索資訊,例如名稱、存取修飾詞 (例如 publicprivate),以及欄位的實作詳細資料 (例如 static),並取得或設定欄位值。

  • 使用 EventInfo 來探索資訊,例如名稱、事件處理常式資料類型、自訂屬性、宣告類型,以及事件的反映類型,並加入或移除事件處理常式。

  • 使用 PropertyInfo 來探索資訊,例如名稱、資料類型、宣告類型、反映類型和唯讀或可寫入的屬性狀態,並且取得或設定屬性值。

  • 使用 ParameterInfo 來探索資訊,例如參數的名稱、資料類型、參數是否為輸入或輸出參數以及方法簽章中的參數位置。

  • 當您在應用程式定義域的僅限反映之內容中工作時,請使用 CustomAttributeData 來探索自訂屬性的相關資訊。 CustomAttributeData 可讓您檢查屬性而不需建立它們的執行個體。 System.Reflection.Emit 命名空間的類別提供一種特殊形式的反映,可讓您在執行階段建置類型。

反映也可以用來建立稱為類型瀏覽器的應用程式,可讓使用者選取類型,然後檢視這些類型的相關資訊。

反映還有其他用途。 JScript 之類的語言編譯器會使用反映來建構符號表。 System.Runtime.Serialization 命名空間中的類別會使用反映來存取資料,並決定要保存哪個欄位。 System.Runtime.Remoting 命名空間中的類別在序列化時會間接使用反映。

反映中的執行階段類型

反映會提供類別,例如 TypeMethodInfo,表示類型、成員、參數和其他程式碼實體。 不過,當您使用反映時不會直接搭配類別使用,其大部分都會是抽象的 (在 Visual Basic 中為 MustInherit)。 您可改用 Common Language Runtime (CLR) 所提供的類型。

例如,當您使用 C# typeof 運算子 (在 Visual Basic 中為 GetType) 來取得 Type 物件時,該物件確實為 RuntimeTypeRuntimeType 衍生自 Type,並提供所有抽象方法的實作。

這些執行階段類別是 internal (在 Visual Basic 中為 Friend)。 它們不會分別從其基底類別記錄,因為它們的行為由基底類別的文件所描述。

標題 描述
檢視類型資訊 描述 Type 類別,並提供程式碼範例說明如何搭配幾個反映類別來使用 Type,以取得建構函式、方法、欄位、屬性和事件的相關資訊。
反映和泛型型別 說明反映如何處理泛型類型和泛型方法的型別參數和型別引數。
反映的安全性考量 描述判斷可使用哪種程度的反映之規則,以探索類型資訊和存取類型。
動態載入和使用型別 描述支援晚期繫結的反映自訂繫結介面。
如何:將組件載入僅限反映的內容 描述僅限反映的載入內容。 示範如何載入組件、如何測試內容,以及如何檢查套用至僅限反映的內容中組件的屬性。
如何:使用 MetadataLoadCoNtext 檢查組件內容 使用 MetadataLoadContext 載入並檢查組件。
存取自訂屬性 示範如何使用反映來查詢屬性是否存在和屬性的值。
指定完整的型別名稱 描述完整的類型名稱之格式,根據巴克斯格式 (BNF),以及指定特殊字元、組件名稱、指標、參考和陣列所需的語法來描述。
如何:使用反映連結委派 說明如何建立方法的委派,以及連結委派到事件。 說明如何在執行階段使用 DynamicMethod 建立事件處理方法。
發出動態方法和組件 說明如何產生動態組件和動態方法。

參考