反射 System.Reflection 命名空間下的類與 System.Type 命名空間使你能夠獲取有關載入的程式集和其中定義的類型的有關信息,如類、介面和值類型等。 可以使用反射在運行時創建、調用和訪問類型實例。 CLR 程式管理應用程式域,應用程式域構成具有相同應用程式範圍的對象周圍定義的邊 ...
反射
System.Reflection 命名空間下的類與 System.Type 命名空間使你能夠獲取有關載入的程式集和其中定義的類型的有關信息,如類、介面和值類型等。 可以使用反射在運行時創建、調用和訪問類型實例。
CLR 程式管理應用程式域,應用程式域構成具有相同應用程式範圍的對象周圍定義的邊界。此管理包括將每個程式集載入到相應的應用程式域中和控制每個程式集內的類型層次結構的記憶體佈局。
程式集包含模塊、模塊包含類型,而類型包含成員。 反射提供封裝程式集、模塊和類型的對象。 可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。 然後,可以調用類型的方法或訪問其欄位和屬性。 反射的典型用法主要有:
-
使用 Assembly 來定義和載入程式集,載入程式集清單中列出的模塊,以及在此程式集中定位一個類型並創建一個它的實例。
-
使用 Module 發現信息,如包含模塊的程式集和模塊中的類。 還可以獲取所有全局方法或模塊上定義的其它特定的非全局方法。
-
使用 ConstructorInfo 發現信息,如名稱、參數、訪問修飾符(如 public 或 private)和構造函數的實現詳細信息(如 abstract 或virtual)。使用 Type 的 GetConstructors 或 GetConstructor 方法來調用特定構造函數。
-
使用 MethodInfo 發現信息,如名稱、返回類型、參數、訪問修飾符(如 public 或 private)和方法的實現詳細信息(如 abstract 或virtual)。 使用 Type 的 GetMethods 或 GetMethod 方法來調用特定方法。
-
使用 FieldInfo 發現信息,如名稱、訪問修飾符(如 public 或 private)和一個欄位的實現詳細信息 (如 static);並獲取或設置欄位值。
-
使用 EventInfo 發現信息(如名稱、事件處理程式的數據類型、自定義特性、聲明類型以及事件的反射的類型),並添加或刪除事件處理程式。
-
使用 PropertyInfo 發現信息(如名稱、數據類型、聲明類型,反射的類型和屬性的只讀或可寫狀態),並獲取或設置屬性值。
-
使用 ParameterInfo 發現信息,如參數的名稱、數據類型、參數是輸入參數還是輸出參數以及參數在方法簽名中的位置。
-
使用 CustomAttributeData 在於應用程式域的僅反射上下文中工作時發現有關自定義特性的信息。 CustomAttributeData 使你能夠檢查特性,而無需創建它們的實例。
System.Reflection.Emit 命名空間的類提供一種專用形式的反射,使你能夠在運行時生成類型。
還可以使用反射來創建稱為類型瀏覽器的應用程式,它使用戶能夠選擇類型,然後查看有關這些類型的信息。
反射還有其它用途。 JScript 等語言的編譯器使用反射來構造符號表。 System.Runtime.Serialization 命名空間中的類使用反射來訪問數據並確定要保存哪些欄位。 System.Runtime.Remoting 命名空間中的類通過序列化間接使用反射。
反射中的運行時類型
反射提供類(如 Type 和 MethodInfo),用於表示類型、成員、參數和其它代碼實體。 但使用反射時,你並不直接使用這些類,其中大部分類均是抽象的。 相反,你使用由公共語言運行時 (CLR) 提供的類型。
例如,使用 C# typeof 運算符獲取 Type 對象時,該對象實際上是 RuntimeType。 RuntimeType 派生自 Type,並提供所有抽象方法的實現。
這些運行時類是 internal。 它們沒有與其基類分開記錄,因為它們的行為由基類文檔來描述。
【參考】微軟官方文檔