.NET 中的反映

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

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

  • 使用 Assembly 來定義和載入組件,載入列在組件資訊清單中的模組,然後從這個組件中尋找類型並建立它的執行個體。
  • 使用 Module 來探索資訊,例如包含模組的組件以及模組中的類別。 您也可以取得所有全域方法,或在模組上所定義的其他特定非全域方法。
  • 使用 ConstructorInfo 來探索資訊,例如名稱、參數、存取修飾詞 (例如 publicprivate),以及建構函式的實作詳細資料 (例如 abstractvirtual)。 使用 TypeGetConstructorsGetConstructor 方法來叫用特定的建構函式。
  • 使用 MethodInfo 來探索方法的名稱、傳回類型、參數、存取修飾詞和實作詳細數據(例如 abstractvirtual) 等資訊。 使用 TypeGetMethodsGetMethod 方法來叫用特定的方法。
  • 使用 FieldInfo 來探索欄位的名稱、存取修飾詞和實作詳細數據等 static資訊,以及取得或設定域值。
  • 使用 EventInfo 來探索資訊,例如名稱、事件處理常式資料類型、自訂屬性、宣告類型,以及事件的反映類型,並加入或移除事件處理常式。
  • 使用 PropertyInfo 來探索資訊,例如名稱、資料類型、宣告類型、反映類型和唯讀或可寫入的屬性狀態,並且取得或設定屬性值。
  • 使用 ParameterInfo 來探索資訊,例如參數的名稱、資料類型、參數是否為輸入或輸出參數以及方法簽章中的參數位置。
  • 當您使用 MetadataLoadContext 或僅限反映的內容 (.NET Framework) 時,使用 CustomAttributeData 來探索自定義屬性的相關信息。 CustomAttributeData 可讓您檢查屬性而不需建立它們的執行個體。

System.Reflection.Emit 命名空間的類別提供一種特殊形式的反映,可讓您在執行階段建置類型。

反思 ion 也可以用來建立類型瀏覽器,讓用戶選取類型,然後檢視這些類型的相關信息。

反映還有其他用途。 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)。 它們不會分別從其基底類別記錄,因為它們的行為由基底類別的文件所描述。

參考