C 程式設計 Reflection 反射

2021-05-31 22:56:23 字數 1552 閱讀 8718

學習c#已有不長不短的一段時間了,反射對我來說一直是很神秘,讓我敬而遠之,開始做公司系統也有近三個月的時間了,從開始到公司熟悉業務,時逢缺人之季,沒過幾天就開始修改bug,到後來做些小需求,做為乙個剛畢業沒啥經驗的新人來說也不可能讓我做什麼太高深的東西,一直這麼忙碌著,到現在系統一些很具體的東西也沒有好好研究一下,不過近日任務較少就開始自己摸索著了解系統,居然遇到反射的問題,學習一下日後工作中難免用到,下面把自己理解的記下來備用……

反射(reflection)是.net中的重要機制,通過反射,可以在執行時獲得.net中另乙個模組或都是dll檔案中的某乙個類及類中成員,包括方法、屬性、事件,以及建構函式等。有了反射,即可對每乙個型別瞭如指掌。如果獲得了建構函式的資訊,即可直接建立物件,即使這個物件的型別在編譯時還不知道

在c#中,我們要使用反射,首先要搞清楚以下命名空間中幾個類的關係

:system.reflection

命名空間

(1)應用程式域,可以將其理解為一組程式集的邏輯容器

(2)assembly:

程式集類

(3)module:

模組類(4)

type:

使用反射得到型別資訊的最核心的類

他們之間是一種從屬關係,也就是說,乙個

可以包含n個

assembly,

乙個assembly

可以包含n個

module,

而乙個module

可以包含n個

type.

這個類我們等下再來講解。我們先關注

assembly

個類,在程式中,如果我們要動態載入乙個程式集怎麼辦呢?有幾種方式可以使用,分別是

load,loadfrom

和loadwithpartialname

三個assembly

的靜態方法

.1. load 方法:極力推薦的一種方法,load 方法帶有乙個程式集標誌並載入它,load 將引起clr把策略應用到程式集上,先後在全域性程式集緩衝區,應用程式基目錄和私有路徑下面查詢該程式集,如果找不到該程式集系統丟擲異常 

2. loadfrom 方法:傳遞乙個程式集檔案的路徑名(包括副檔名),clr會載入您指定的這個程式集,傳遞的這個引數不能包含任何關於版本號的資訊,區域性,和公鑰資訊,如果在指定路徑找不到程式集丟擲異常。 

3. loadwithpartialname:永遠不要使用這個方法,因為應用程式不能確定再在載入的程式集的版本。該方法的唯一用途是幫助那些在.net框架的測試環節使用.net 框架提供的某種行為的客戶,這個方法將最終被拋棄不用。 如:

如果在模組a中有乙個窗體類

public class frmtest

public viod forminitmethod(string para1)

}在模組b中有類

using system;

using system.reflection; 

public void  reflectionexample() }

}暫時寫到先這裡,略懂一二,有待更深入學習,今天寫了第一篇文章,不管怎麼樣總之還是很高興,加油……

談談C 反射(Reflection)

反射是什麼?官方給出的解釋 反射提供了封裝程式集 模組和型別的物件 system.type型別 可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。個人理解 在執行態下,動態訪問 修改自身的功能。今天我們利用反射為程式動態引導程式集 assemb...

整理 C 反射 Reflection 詳解

反射的定義 審查元資料並收集關於它的型別資訊的能力。元資料 編譯以後的最基本資料單元 就是一大堆的表,當編譯程式集或者模組時,編譯器會建立乙個類定義表,乙個字段定義表,和乙個方法定義表等。system.reflection命名空間包含的幾個類,允許你反射 解析 這些元資料表的 system.refl...

C 反射 Reflection 小結整理

system.reflection命名空間包含的幾個類 system.reflection.assembly system.reflection.memberinfo system.reflection.eventinfo system.reflection.fieldinfo system.ref...