C 基礎知識回顧 反射(1)

2021-06-18 02:21:29 字數 2272 閱讀 9205

反射(reflection)是一種允許使用者獲得型別資訊的c#特性。術語「反射」源自於它的工作方式:

type物件對映它所代表的底層物件。對type物件進行查詢可以獲得(反射)與型別相關的資訊。反

射是一種

功能強大的機制,它允許學習和使用只在執行時才能知道的型別功能。

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

反射的核心是system.type。system.type包含了很多屬性和方法,使用這些屬性和方法可以在執行時得

到型別資訊。

一旦得到型別資訊,就可以呼叫其建構函式、方法和屬性。因此,反射允許使用編譯時不可用的代

碼。因為反射涉及內容太多,我們主要學習常用的反射技術。

一旦有了type物件,就可以使用getmethods()方法來獲取此型別支援的方法的列表。它的一種形式為:

methodinfo getmethods()

methodinfo物件描述了主調型別所支援的方法,因此可以通過它的name屬性獲得方法的名稱。同時它還有兩個重

要的方法,returntype和getparameters()。

唯讀屬性returntype為乙個type型別的物件,它為使用者提供方法的返回型別資訊。

getparameters()返回乙個方法的引數列表,它的基本形式為:

parameterinfo getparameters()

引數資訊儲存在parameterinfo物件中。parameterinfo類定義了大量描述引數資訊的屬性和方法。

其中常用屬性是name和parametertype,這兩個屬性我就不介紹了,從字面上應該可以理解了。

好了,不說了,講了這麼多概念想必大家都不耐煩了。下面我們先看**示例,估計你看了以後,再結合上面的

概念講解,你一定會說:哦,原來如此!!!

class

myclass

public

intsum()

public

bool isbetween(int

i)

public

void set(int a, int

b)

public

void set(double a, double

b)

public

void

show()

,y:", x, y);}}

執行結果:

請注意,除了myclass定義的方法外,object定義的方法也會被顯示。這是因為c#

所有的類都繼承於

object。

另外,型別名稱(如int32)採用的是.net結構的名稱。

二、getmethods()的另外一種形式

這種形式中可以指定各種標記,以此篩選出想要獲取的方法,它的基本形式:

methodinfo getmethods(bindingflags flags)

這種形式只獲得與所指定的條件相匹配的方法,bindingflages 是乙個列舉,相關知識請參考:

msdn上

bindingflags 列舉

可以使用or運算子把兩個或者更多的標記連線在一起。實際上,括號中至少應包含instance(或static)

與public(或notpublic)標記,否則將不會獲得任何方法。

getmethods()方法的bindingflages形式的乙個主要用途在於,它可以只獲得某個類自身定義的方法而不

獲得它從基類繼承的方法,這對於object尤其有用。

例如用下列形式來替換前面程式中的getmethods()語句:

methodinfo mi = t.getmethods(bindingflags.declaredonly |bindingflags.instance |bindingflags.public);
進行上述更改後,程式的輸出結果為:

可以看出,這裡只顯示了myclass顯示定義的方法。

未完待續……

ps:由於工作原因,本打算今天的更新可能要推遲到週六實在抱歉……

C 基礎知識回顧 反射(3)

獲取type物件的建構函式 前一篇因為篇幅問題因為篇幅太短被移除首頁,反射這一塊還有一篇 怎樣在程式集中使用反射 其他沒有 什麼可以寫的了,前兩篇主要是鋪墊,在實際應用中,主要是最後兩篇。其實寫完反射,我也考慮重新把委託重新寫下,現在 想想確實太過單一和簡單了。我會把實際開發中委託的例子多寫幾個 以...

C 基礎知識回顧 反射(2)

使用反射呼叫方法 一旦知道乙個型別所支援的方法,就可以對方法進行呼叫。呼叫時,需使用包含在 methodinfo中的invoke 方法。呼叫形式 object invoke object ob,object args 這裡ob是乙個物件引用,將呼叫它所指向的物件上的方法。對於靜態方法,ob必須為nu...

c語言基礎知識回顧1

1.1 字元常量是由單引號括起來的乙個字元,字元兩側的單引號是必不可少的。2 字串常量是由一對雙引號括起來的乙個字串行,字串常量中不能直接包含單引號雙引號和單個反斜槓 若使用需使用轉義字元。常用的轉義字元 n 換行,將游標從當前位置移動到下一行開頭。r 回車,將游標從當前位置移到本行開頭。0 空字元...