|
1. 什么是反射
Reflection,中文翻譯為 反射。
這是.NET中獲取 運行時類型信息 的方式,.NET的應(yīng)用程序由幾個部分:'程序集(Assembly)’、'模塊(Module)’、'類型(class)’組成,而反射提供一種編程的方式,讓程序員可以在程序運行期獲得這幾個組成部分的相關(guān)信息,例如:
通常程序員面試題,有這樣關(guān)于反射的解釋:反射可以動態(tài)地創(chuàng)建類型的實例,還可以將類型綁定到現(xiàn)有對象,或從現(xiàn)有對象中獲取類型。然后,可以調(diào)用類型的方法或訪問其字段和屬性。
Assembly類可以獲得正在運行的裝配件信息,也可以動態(tài)的加載裝配件,以及在裝配件中查找類型信息,并創(chuàng)建該類型的實例。
Type類可以獲得對象的類型信息,此信息包含對象的所有要素:方法、構(gòu)造器、屬性等等,通過Type類可以得到這些要素的信息,并且調(diào)用之。
MethodInfo包含方法的信息,通過這個類可以得到方法的名稱、參數(shù)、返回值等,并且可以調(diào)用之。
諸如此類,還有FieldInfo、PropertyInfo、ConstructorInfo、EventInfo等等,這些類都包含在System.Reflection命名空間。
2. 命名空間與裝配件的關(guān)系
很多人對這個概念可能還是很不清晰,對于合格的.NET程序員,有必要對這點進行澄清。
命名空間類似與Java的包,但又不完全等同,因為Java的包必須按照目錄結(jié)構(gòu)來放置,命名空間則不需要。
核心語:裝配件是.NET應(yīng)用程序執(zhí)行的最小單位,編譯出來的.dll、.exe都是裝配件。
裝配件和命名空間的關(guān)系不是一一對應(yīng),也不互相包含,一個裝配件里面可以有多個命名空間,一個命名空間也可以在多個裝配件中存在,這樣說可能有點模糊,舉個例子:
裝配件A:










(1)一個DataBaseType屬性,這個屬性返回擴展的或是要支持的數(shù)據(jù)庫管理系統(tǒng)的標(biāo)識或描述,這樣就可以知道是使用那個數(shù)據(jù)庫系統(tǒng),根據(jù)Web.config提取相關(guān)了(不明白就往下走);
(2)第一個方法(Insert(OrderInfo order))(這里我定義了一個OrderInfo類(實體),這個類(實體對象)提供對數(shù)據(jù)的封裝,在這里,簡單地說就是將訂單的相關(guān)信息(見實體類中定義的屬性),封裝在該實體類創(chuàng)建的實體對象中,作為該插入(Insert)新紀(jì)錄的參數(shù)。
(3)第二個方法(GetOrder(int orderId)) 這個方法由提供的訂單Id(orderId)從數(shù)據(jù)庫中,讀取相關(guān)數(shù)據(jù),記錄在創(chuàng)建的OrderInfo實體對象中,通過該實體對象的屬性可以讀取相關(guān)信息,如訂單生成日期,金額,發(fā)送地址等;
那么我規(guī)定所有的數(shù)據(jù)訪問邏輯(基于基于某一數(shù)據(jù)庫系統(tǒng))都必須派生一個數(shù)據(jù)庫訪問層,并且實現(xiàn)這個接口,在定義的方法中返回處理處理Code對象,并且可以指定,數(shù)據(jù)庫類型的描述(如DBMS Name)。
這樣的話,我就不需要在開發(fā)系統(tǒng)時知道將來需要采用的數(shù)據(jù)系統(tǒng)類型(是采用Ms SqlServer 呢?還是采用Oracle呢?等等),只需要從配置文件中獲取現(xiàn)在所指定的數(shù)據(jù)庫系統(tǒng)的描述,就可以動態(tài)的創(chuàng)建對象,將其轉(zhuǎn)換為IOrder接口來使用。
這就是反射的一個典型的應(yīng)用,在.NET PetShop 4.0 中有重要使用這一方式。
4.通過一個Demo演示,一個對象的實例泄漏的秘密(這是我從別人那看來的)












































































NET技術(shù):C# 參考:反射 -- 學(xué)習(xí)筆記整理,概念與應(yīng)用,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。