反射(C 程式設計指南)

2021-06-01 22:16:42 字數 2453 閱讀 2912

反射實際上就是動態的得到程式集中的屬性和方法

反射提供了封裝程式集、模組和型別的物件(type 型別)。可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。如果**中使用了屬性,可以利用反射對它們進行訪問。有關更多資訊,請參見屬性。

下面是使用靜態方法gettype-- 從object基類派生的所有型別都繼承該方法 -- 獲取變數型別的簡單反射示例:c#

// using gettype to obtain type information:

int i = 42;

system.type type = i.gettype();

system.console.writeline(type);

輸出為:

system.int32

此示例使用反射獲取已載入的程式集的完整名稱:c#

// using reflection to get information from an assembly:

system.reflection.assembly o = system.reflection.assembly.load("mscorlib.dll");

system.console.writeline(o.getname());

輸出為:

mscorlib, version=2.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089

下面借用下朱述祿

反射是一種機制,通過這種機制我們可以知道乙個未知型別的型別資訊.比如,有乙個物件a,這個物件不是我們定義的,也許是通過網路捕捉到的,也許是使用泛型定義的,但我們想知道這個物件的型別資訊,想知道這個物件有哪些方法或者屬性什麼的.甚至我們想進一步呼叫這個物件的方法.關鍵是現在我們只知道它是乙個物件,不知道它的型別,自然不會知道它有哪些方法等資訊.這時我們該怎麼辦?反射機制就是解決這麼乙個問題的.通過反射機制我們可以知道未知型別物件的型別資訊.

再比如,我們有乙個dll檔案,我們想呼叫裡面的類.現在假設這個dll檔案的類的定義,數量等不是固定的,是經常變化的.也許某一天你要在這個dll裡面增加乙個類定義.也許你覺得這沒什麼問題,現在關鍵是我們在另乙個程式集裡面要呼叫這個dll,這是我們的程式必須能夠適應這個dll的變化,也就是說即使改變了dll檔案的定義也不需要改變我們的程式集.這時候我們就會使用乙個未知dll.我們該怎麼辦?同樣,反射機制幫助了我們,我們可以通過反射來實現.

說白了,反射就是能知道我們未知型別的型別資訊這麼乙個東西.沒什麼神秘可講!

今天我先講乙個獲得程式集資訊的例子.

下面我們來舉乙個例子.例子的思路是這樣的:我們有乙個dll.該dll裡面有許多關於運動的類.每乙個類記錄了一種體育運動的資訊.我們在另外乙個程式裡面要知道這個dll的資訊:(如果你還不能明白我的意思,請耐心的照我的步驟把這個過程走一變!)

第一步:我們建乙個檔案sport.cs.內容如下:

using system;

public abstract class sport

咱們用命令"csc /t:library sport.cs"編譯它.

第二步,我們再建乙個名為somesports.cs的檔案,內容如下:

using system;

public class football:sport

public override string getduration()

public override string getname()}

public class hockey:sport

public override string getduration()

public override string getname()

}public class soccer:sport

public override string getduration()

public override string getname()}

下面我們用命令"csc /t:library /r:sport.dll somesports.cs"編譯該檔案.

現在我們有了我們的運動資訊dll檔案.現在我們想通過程式知道裡面有哪些類.請進入最後一步:

第三步:我們建立檔案assemblydemo.cs".內容如下:

using system;

using system.reflection;

public class assemblydemo

else

else}}

}}咱們用命令"csc /r:sport.dll assemblydemo.cs"編譯該檔案.

下面我們用"assemblydemo somesports.dll"執行該程式.

進一步程式要求我們輸入選項,咱們輸入1,就顯示了結果:hockeyhasthree 20 minute periods.

C 反射程式設計

一 獲取屬性集 typeof type getproperties bindingflags.public bindingflags.instance tolist 二 關於屬性型別的判斷 1 基礎型別可以直接取值和賦值 2 陣列型別 property.propertytype.isarray tr...

C 程式設計 Reflection 反射

學習c 已有不長不短的一段時間了,反射對我來說一直是很神秘,讓我敬而遠之,開始做公司系統也有近三個月的時間了,從開始到公司熟悉業務,時逢缺人之季,沒過幾天就開始修改bug,到後來做些小需求,做為乙個剛畢業沒啥經驗的新人來說也不可能讓我做什麼太高深的東西,一直這麼忙碌著,到現在系統一些很具體的東西也沒...

C 高階程式設計之「反射」

一,定義 反射技術,能夠讓託管 在執行時檢視元資料以及 的各方面資訊。二,常用方法 1,獲取物件方法 必須以public修飾的方法,不包括建構函式 2,獲取物件屬性 3,獲取物件的父類 附示例 using system using system.collections.generic using s...