首先來說一下什麼是反射?
反射提供了封裝程式集、子產品和類型的對象(Type類型)
可以使用反射動态的建立類型的執行個體,将類型綁定到現有對象,或從現有對象中擷取類型,然後,可以調用類型的方法或通路其字段和屬性 。
總之,有了反射,以前很多實作不了的功能都可以實作。
下面先來寫一個小例子,體驗一下反射是怎麼一回事:
打開VS2010,建立一個控制台應用程式,在program.cs裡面寫代碼
首先引入命名空間:
下如下代碼:
這裡通過反射擷取string的Length屬性,并通過調用PropertyInfo 的GetValues方法擷取屬性值,其中GetValues方法的原型如下:
第一個參數obj是擁有此屬性的類的執行個體,在這個例子中,為字元串s,s擁有Length屬性。
第二個參數為索引值,微軟解釋如下:
Optional index values for indexed properties. This value should be null for non-indexed properties.
一般情況下用null,大家可以自己深入研究一下。
GetValues方法傳回的是object類型,是以必須強制轉換類型。
下面通過反射來擷取string的一個方法,看看方法是如何通過反射得到的,代碼如下:
其中,Invoke的方法定義如下:
這個就很好了解了,第一個參數為擁有此方法的類的執行個體,還是為string執行個體s.
第二個參數就是一個object數組的參數。
這裡調用的是string中的Contains方法,判斷string中是否包含某個字元串。
下面通過反射來執行個體化一個string對象,代碼如下:
這個跟擷取方法相似,唯一不同的就是string的構造方法參數是char[]數組,是以必須傳入符合的類型。這裡執行個體化了一個string,值為Hello。
看到這裡,你對反射已經有了初步的了解,下面開始進入實戰應用:
在解決方案上面點選滑鼠右鍵,添加項目,選中類庫,輸入名稱,添加一個類庫。
在類庫中添加Custom類,代碼如下:
這裡隻聲明了幾個屬性和一個方法,供示範使用。寫好後編譯一下,在控制台項目裡面添加引用這個類庫(為了友善,否則每次編譯都要手動拷貝DLL到控制台項目下面),這樣VS會自動将生成的DLL拷貝到控制台debug目錄下,友善調用。下面開始使用反射來加載這個DLL,代碼如下:
注意了,這裡首先要擷取DLL的實體路徑,是以上面是否添加引用是無所謂的。有了路徑後,通過Assembly的LoadFile方法加載DLL,再擷取類的Type,注意GetType方法裡面的參數必須為類的全稱,及命名空間 + 類名,否則無法找到。
最後一行,建立了一個類的執行個體,類型為object類型。
下面來擷取Custom的所有屬性,代碼如下:
通過調用GetProperties方法擷取所有屬性,儲存到PropertyInfo[]數組中,然後周遊數組輸出屬性值。
下面是各個屬性的含義:
Name 屬性名稱
PropertyType 屬性資料類型
ReflectedType 所在的類的命名控件 + 類名
Module 所在的DLL檔案名稱
設定某個屬性的值,方法如下:
是不是很容易啊。。。
下面來說一下,調用類的方法,和一些屬性。代碼如下: