以前,假設我們要不借助任何類庫直接解析json協定的東西,比如{“a”:"a","b":"b","c":"c"},并且我們需要将他們賦給一個與之對應的實體類。那麼我們需要寫出如下的代碼來解析


從上面代碼中,可以知道,當要為一個實體類指派和解析的屬性比較少的時候,我們要寫的代碼還是可以讓人接受的,但是一旦實體類的代碼一多,那麼整個過程就非常地惡心。通過反射,我們可以擷取一個實體類中的資訊,通過擷取運作時的函數資訊,我們又可以動态地調用函數,為實體類動态指派。以上代碼如果用反射的相關方法來寫的話,就會變得異常簡潔。




我們有一個helloworld類,我們想要通過反射動态地擷取他的資訊,并動态地調用他的方法。


下面我們将應用反射進行擷取方法名、動态建立類的執行個體、動态調用方法


結果截圖如下所示
要徹底地了解反射,我們還需要了解.net可執行應用程式的結構。
程式代碼在編譯後生成可執行的應用,我們首先要了解這種可執行應用程式的結構。
應用程式結構分為應用程式域—程式集—子產品—類型—成員幾個層次,公共語言運作庫加載器管理應用程式域,這種管理包括将每個程式集加載到相應的應用程式域以及控制每個程式集中類型層次結構的記憶體布局。
程式集包含子產品,而子產品包含類型,類型又包含成員,反射則提供了封裝程式集、子產品和類型的對象。我們可以使用反射動态地建立類型的執行個體,将類型綁定到現有對象或從現有對象中擷取類型,然後調用類型的方法或通路其字段和屬性。反射通常具有以下用途。
(1)使用assembly定義和加載程式集,加載在程式集清單中列出子產品,以及從此程式集中查找類型并建立該類型的執行個體。
(2)使用module了解包含子產品的程式集以及子產品中的類等,還可以擷取在子產品上定義的所有全局方法或其他特定的非全局方法。
(3)使用constructorinfo了解構造函數的名稱、參數、通路修飾符(如pulic 或private)和實作詳細資訊(如abstract或virtual)等。使用type的getconstructors或getconstructor方法來調用特定的構造函數。
(4)使用methodinfo了解方法的名稱、傳回類型、參數、通路修飾符(如pulic 或private)和實作詳細資訊(如abstract或virtual)等。使用type的getmethods或getmethod方法來調用特定的方法。
(5)使用fiedinfo了解字段的名稱、通路修飾符(如public或private)和實作詳細資訊(如static)等,并擷取或設定字段值。
(6)使用eventinfo了解事件的名稱、事件處理程式資料類型、自定義屬性、聲明類型和反射類型等,添加或移除事件處理程式。
(7)使用propertyinfo了解屬性的名稱、資料類型、聲明類型、反射類型和隻讀或可寫狀态等,擷取或設定屬性值。
(8)使用parameterinfo了解參數的名稱、資料類型、是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。
system.reflection.emit命名空間的類提供了一種特殊形式的反射,可以在運作時構造類型。
參考連接配接
<a href="http://kb.cnblogs.com/page/46903/">c# 參考:反射 -- 學習筆記整理,概念與應用</a>
<a href="http://kb.cnblogs.com/page/42279/">什麼是反射?</a>
<a href="http://kb.cnblogs.com/page/50133/">c# 反射技術應用</a>
<a href="http://msdn.microsoft.com/zh-cn/library/vstudio/gg145033.aspx">system.reflection 命名空間</a>
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
轉載:http://www.cnblogs.com/kissazi2/p/3293163.html