反射(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,這兩個屬性我就不介紹了,從字面上應該可以了解了。
好了,不說了,講了這麼多概念想必大家都不耐煩了。下面我們先看代碼示例,估計你看了以後,再結合上面的
概念講解,你一定會說:哦,原來如此!!!
運作結果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuATO1AjN5ETOlNGZhVGNldDMwM2NkNmNwUWZ1MjNxQjNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
請注意,除了MyClass定義的方法外,object定義的方法也會被顯示。這是因為C#所有的類都繼承于object。
另外,類型名稱(如Int32)采用的是.net結構的名稱。
二、GetMethods()的另外一種形式
這種形式中可以指定各種标記,以此篩選出想要擷取的方法,它的基本形式:
MethodInfo[] GetMethods(BindingFlags flags)
這種形式隻獲得與所指定的條件相比對的方法,BindingFlages 是一個枚舉,相關知識請參考:
可以使用OR運算符把兩個或者更多的标記連接配接在一起。實際上,括号中至少應包含Instance(或Static)
與Public(或NotPublic)标記,否則将不會獲得任何方法。
GetMethods()方法的BindingFlages形式的一個主要用途在于,它可以隻獲得某個類自身定義的方法而不
獲得它從基類繼承的方法,這對于object尤其有用。
例如用下列形式來替換前面程式中的GetMethods()語句:
進行上述更改後,程式的輸出結果為:
可以看出,這裡隻顯示了MyClass顯示定義的方法。
未完待續……
PS:由于工作原因,本打算今天的更新可能要推遲到周六實在抱歉……