熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

對.NET Framework 反射的反思[2]

2022-06-13   來源: .NET編程 

  另一種完全不同的情況是解釋性編程語言總是通過主進程獲得執行(腳本語言通常屬於此類)由於程序的完整定義是可用的(作為輸入源代碼)並跟完整的語言實現結合在一起(作為解釋器本身)因此所有支持自我分析所需的技術都到位了這種動態語言頻繁地提供全面反射功能以及一組用於動態分析和操作程序的豐富工具

  NET Framework CLR 和它的承載語言如 C# 屬於中間形態編譯器用來把源代碼轉換成 IL 和元數據後者與源代碼相比雖屬於較低級別或者較低邏輯性但仍然保留了很多抽象結構和類型信息一旦 CLR 啟動和承載了此程序基類庫 (BCL) 的 SystemReflection 庫便可以使用此信息並返回關於對象類型類型成員成員簽名等的信息此外它也可以支持調用包括後期綁定調用

  NET 中的反射

  要在用 NET Framework 編程時利用反射您可以使用 SystemReflection 命名空間此命名空間提供封裝了很多運行時概念的類例如程序集模塊類型方法構造函數字段和屬性 中的表顯示SystemReflection 中的類如何與概念上運行時的對應項對應起來

  盡管很重要不過 SystemReflectionAssembly 和 SystemReflectionModule 主要用於定位新代碼並將其加載到運行時本專欄中我暫不討論這些部分並且假定所有相關代碼都已經加載

  要檢查和操作已加載代碼典型模式主要是 SystemType通常您從獲得一個所關注運行時類別的 SystemType 實例開始(通過 ObjectGetType)接著您可以使用 SystemType 的各種方法在 SystemReflection 中探索類型的定義並獲得其它類的實例例如如果您對某特定方法感興趣並希望獲得此方法的一個 SystemReflectionMethodInfo 實例(可能通過 TypeGetMethod)同樣如果您對某字段感興趣並希望獲得此字段的一個 SystemReflectionFieldInfo 實例(可能通過 TypeGetField)

  一旦獲得所有必要的反射實例對象即可根據需要遵循檢查或操作的步驟繼續檢查時您在反射類中使用各種描述性屬性獲得您需要的信息(這是通用類型嗎?這是實例方法嗎?)操作時您可以動態地調用並執行方法通過調用構造函數創建新對象等等

  檢查類型和成員

  讓我們跳轉到一些代碼中探索如何運用基本反射進行檢查我將集中討論類型分析從一個對象開始我將檢索它的類型而後考察幾個有意思的成員(請參見圖 )

  首先需要注意的是在類定義中乍看起來說明方法的篇幅比我預期的要多很多這些額外的方法是從哪裡來的呢?任何精通 NET Framework 對象層次結構的人都會識別從通用基類 Object 自身繼承的這些方法(事實上我首先使用了 ObjectGetType 檢索其類型)此外您可以看到屬性的 getter 函數現在如果您只需要 MyClass 自身顯式定義的函數該怎麼辦呢?換句話說您如何隱藏繼承的函數?或者您可能只需要顯式定義的實例函數?

  隨便在線看看 MSDN就會發現大家都願意使用 GetMethods 第二個重載方法它接受 BindingFlags 參數通過結合來自 BindingFlags 枚舉中不同的值您可以讓函數僅返回所需的方法子集替換 GetMethods 調用代之以

  GetMethods(BindingFlagsInstance | BindingFlagsDeclaredOnly |BindingFlagsPublic)

  結果是您得到以下輸出(注意這裡不存在靜態幫助器函數和繼承自 SystemObject 的函數)

  Reflection Demo Example

  Type Name: MyClass

  Method Name: MyMethod

  Method Name: MyMethod

  Method Name: get_MyProperty

  Property Name: MyProperty

  如果您事先知道類型名稱(完全限定)和成員又該如何?您如何完成從枚舉類型向檢索類型的轉換?有了前兩個示例中的代碼您已經有了能夠實現基元類浏覽器的基本組件通過名稱您可以找到一個運行時實體然後枚舉其各種相關屬性

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15776.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.