C 基礎 反射

2021-08-28 06:06:57 字數 2739 閱讀 9958

反射指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。

程式集包含模組,而模組包含型別,型別又包含成員。

反射則提供了封裝程式集、模組和型別的物件。

您可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從現有物件中獲取型別。

然後,可以呼叫型別的方法或訪問其字段和屬性。

優點:1、反射提高了程式的靈活性和擴充套件性。

2、降低耦合性,提高自適應能力。

3、它允許程式建立和控制任何類的物件,無需提前硬編碼目標 類。

缺點:1、效能問題:使用反射基本上是一種解釋操作,用於欄位和方 法接入時要遠慢於直接**。因此反射機制主要應用在對靈 活性和拓展性要求很高的系統框架上,普通程式不建議使 用。

2、使用反射會模糊程式內部邏輯;程式設計師希望在源**中看到 程式的邏輯,反射卻繞過了源**的技術,因而會帶來維護 的問題,反射**比相應的直接**更複雜。

反射的用途:

1.使用assembly定義和引導程式集,載入在程式集中的所有模 塊以及從此程式集中查詢型別並建立該型別的例項。

2.使用module了解包含模組的程式集以及模組中的類等,還可 以獲取在模組上定義的所有全域性方法或其他特定的非全域性 方法。

3.使用constructorinfo了解建構函式的名稱、引數、訪問修飾 符(如pulic 或private)和實現詳細資訊(如abstract或 virtual)等。

4.使用methodinfo了解方法的名稱、返回型別、引數、訪問修 飾符(如pulic 或private)和實現詳細資訊(如abstract或 virtual)等。

5.使用fiedinfo了解欄位的名稱、訪問修飾符(如public或 private)和實現詳細資訊(如static)等,並獲取或設定字段 值。

6.使用eventinfo了解事件的名稱、事件處理程式資料型別、自 定義屬性、宣告型別和反射型別等,新增或移除事件處理 程式。

7.使用propertyinfo了解屬性的名稱、資料型別、宣告型別、 反射型別和唯讀或可寫狀態等,獲取或設定屬性值。

8.使用parameterinfo了解引數的名稱、資料型別、是輸入引數 還是輸出引數,以及引數在方法簽名中的位置等。

反射用到的主要類:

1.system.type 類

通過這個類可以訪問任何給定資料型別的資訊。

2.system.reflection.assembly 類

它可以用於訪問給定程式集的資訊,或者把這個程式集載入 到程式中。

system.type類用法:

system.type類對於反射起著核心的作用。但它是乙個抽象的基類,type有與每種資料型別對應的派生類,我們使用這個派生類的物件的方法、字段、屬性來查詢有關該型別的所有資訊。獲取給定型別的type引用有3種常用方式:

1.使用 c# typeof 運算子

2.使用物件gettype()方法

3.呼叫type類的靜態方法gettype(「類的全路徑」)

type類的屬性:

1.name資料型別名

2.fullname 資料型別的完全限定名(包括命名空間名)

3.namespace 定義資料型別的命名空間名

4.isabstract 指示該型別是否是抽象型別

5.isarray 指示該型別是否是陣列

6.isclass 指示該型別是否是類

7.isenum 指示該型別是否是列舉

8.isinte***ce 指示該型別是否是介面

9.ispublic 指示該型別是否是公有的

10.issealed 指示該型別是否是密封類

11.isvaluetype 指示該型別是否是值型別

type類的方法:

1.getconstructor(), getconstructors():

返回constructorinfo型別,用於取得該類的建構函式的資訊

2.getevent(), getevents():

返回eventinfo型別,用於取得該類的事件的資訊

3.getfield(), getfields():

返回fieldinfo型別,用於取得該類的字段(成員變數)的 資訊

4.getinte***ce(), getinte***ces():

返回inte***ceinfo型別,用於取得該類實現的介面的資訊

5.getmember(), getmembers():

返回memberinfo型別,用於取得該類的所有成員的資訊

6.getmethod(), getmethods():

返回methodinfo型別,用於取得該類的方法的資訊

7.getproperty(), getproperties():

返回propertyinfo型別,用於取得該類的屬性的資訊

system.reflection.assembly類的用法:

assembly類可以獲得程式集的資訊,也可以動態的引導程式集,以及在程式集中查詢型別資訊,並建立該型別的例項。使用assembly類可以降低程式集之間的耦合性,有利於軟體結構的合理化。

1.通過程式集名稱返回assembly物件

assembly.load(「類名」);

2.通過dll檔名稱返回assembly物件 assembly.loadfrom(@「c:\reflectiondemo2.dll」);

3.通過assembly獲取程式集中類

assembly物件名.gettype(「引數必須是類的全名」);

4.通過assembly獲取程式集中所有的類

assembly物件名.gettypes();

C 基礎 反射

反射的實現主要依賴於微軟提供的兩個命名空間 system.reflection 和system.type 兩個命名空間 反射 就是動態的獲取程式集,並獲取其中型別的元資料,然後訪問該型別的過程。可以在執行時 建立 訪問 呼叫 型別。反射在實際應用中通常被用於 深複製實現,資料庫datatable 轉...

C 基礎 反射

記錄一下放射的一些東西把,之前都是學了記在筆記本上,現在整理上來,當作是複習和知新。反射的實現主要依賴於微軟提供的兩個命名空間 system.reflection 和system.type 兩個命名空間 反射 就是動態的獲取程式集,並獲取其中型別的元資料,然後訪問該型別的過程。可以在執行時 建立 訪...

C 基礎語法 反射

參考文獻 乙個執行的程式,檢視本身的元素或其他型別的元資料的行為叫做反射 mvc ioc orm aop 這些都用到反射。class baseclass class derivedclass baseclass static void main string args foreach var v i...