反射與C#實(shí)現(xiàn)_第1頁(yè)
反射與C#實(shí)現(xiàn)_第2頁(yè)
反射與C#實(shí)現(xiàn)_第3頁(yè)
反射與C#實(shí)現(xiàn)_第4頁(yè)
反射與C#實(shí)現(xiàn)_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、反射與C嫁現(xiàn)【摘要】該文對(duì)反射較為深入的分析,介紹了反射的用途和特點(diǎn),并著重介紹了反射的性能優(yōu)化方法。【關(guān)鍵詞】反射;C#;軟件中圖分類(lèi)號(hào):TP39文獻(xiàn)標(biāo)識(shí)碼A文章編號(hào)1006-0278(2015)11-127-01當(dāng)你做一個(gè)軟件可以安裝插件的功能,你連插件的類(lèi)型名稱(chēng)都不知道,你怎么實(shí)例化這個(gè)對(duì)象呢?因?yàn)槌绦蚴侵С植寮模ǖ谌降模?,在開(kāi)發(fā)的時(shí)候并不知道。所以,無(wú)法在代碼中New出來(lái),但反射可以,通過(guò)反射,動(dòng)態(tài)加載程序集,然后讀出類(lèi),檢查標(biāo)記之后再實(shí)例化對(duì)象,就可以獲得正確的類(lèi)實(shí)例。反射的目的就是為了擴(kuò)展未知的應(yīng)用。比如你寫(xiě)了一個(gè)程序,這個(gè)程序定義了一些接口,只要實(shí)現(xiàn)了這些接口的dll都可以作

2、為插件來(lái)插入到這個(gè)程序中。那么怎么實(shí)現(xiàn)呢?就可以通過(guò)反射來(lái)實(shí)現(xiàn)。就是把dll加載進(jìn)內(nèi)存,然后通過(guò)反射的方式來(lái)調(diào)用dll中的方法。反射Reflection,MFC時(shí)代叫RTTI(RuntimeTypeIdentification)運(yùn)行時(shí)類(lèi)型識(shí)別,提供一種動(dòng)態(tài)創(chuàng)建對(duì)象的能力。反射(Reflection)是.NET中的重要機(jī)制,通過(guò)反射,可以在運(yùn)行時(shí)獲得.NET中每一個(gè)類(lèi)型(包括類(lèi)、結(jié)構(gòu)、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構(gòu)造函數(shù)等。還可以獲得每個(gè)成員的名稱(chēng)、限定符和參數(shù)等。有了反射,即可對(duì)每一個(gè)類(lèi)型了如指掌。如果獲得了構(gòu)造函數(shù)的信息,即可直接創(chuàng)建對(duì)象,即使這個(gè)對(duì)象的類(lèi)型在編譯時(shí)

3、還不知道。程序代碼在編譯后生成可執(zhí)行的應(yīng)用,我們首先要了解這種可執(zhí)行應(yīng)用程序的結(jié)構(gòu)。應(yīng)用程序結(jié)構(gòu)分為應(yīng)用程序域一程序集一模塊一類(lèi)型一成員幾個(gè)層次,公共語(yǔ)言運(yùn)行庫(kù)加載器管理應(yīng)用程序域,這種管理包括將每個(gè)程序集加載到相應(yīng)的應(yīng)用程序域以及控制每個(gè)程序集中類(lèi)型層次結(jié)構(gòu)的內(nèi)存布局。程序集包含模塊,而模塊包含類(lèi)型,類(lèi)型又包含成員,反射則提供了封裝程序集、模塊和類(lèi)型的對(duì)象。我們可以使用反射動(dòng)態(tài)地創(chuàng)建類(lèi)型的實(shí)例,將類(lèi)型綁定到現(xiàn)有對(duì)象或從現(xiàn)有對(duì)象中獲取類(lèi)型,然后調(diào)用類(lèi)型的方法或訪問(wèn)其字段和屬性??梢允褂肅onstructorInfo了解構(gòu)造函數(shù)的名稱(chēng)、參數(shù)、訪問(wèn)修飾符(如pulic或private)和實(shí)現(xiàn)詳細(xì)信

4、息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法來(lái)調(diào)用特定的構(gòu)造函數(shù)。System.Reflection.Emit命名空間的類(lèi)提供了一種特殊形式的反射,可以在運(yùn)行時(shí)構(gòu)造類(lèi)型。反射也可用于創(chuàng)建稱(chēng)為類(lèi)型瀏覽器的應(yīng)用程序,使用戶能夠選擇類(lèi)型,然后查看有關(guān)選定類(lèi)型的信息。在設(shè)計(jì)模式實(shí)現(xiàn)中常使用反射技術(shù),如采用反射技術(shù)可以簡(jiǎn)化工廠的實(shí)現(xiàn)。;通過(guò)反射可以將需要實(shí)現(xiàn)的子類(lèi)名稱(chēng)傳遞給工廠方法,這樣無(wú)須在子類(lèi)中實(shí)現(xiàn)類(lèi)的實(shí)例化;使用反射可以減少抽象工廠的子類(lèi);采用反射技術(shù)可以簡(jiǎn)化工廠代碼的復(fù)雜程度,在.NET項(xiàng)目中,采用反射技術(shù)的工廠已經(jīng)基

5、本代替了工廠方法;采用反射技術(shù)可以極大地簡(jiǎn)化對(duì)象的生成,對(duì)以下設(shè)計(jì)模式的實(shí)現(xiàn)也有很大影響。反射的層次間都是一對(duì)多的關(guān)系。使用反射可以使用反射動(dòng)態(tài)地創(chuàng)建類(lèi)型的實(shí)例,將類(lèi)型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類(lèi)型;應(yīng)用程序需要在運(yùn)行時(shí)從某個(gè)特定的程序集中載入一個(gè)特定的類(lèi)型,以便實(shí)現(xiàn)某個(gè)任務(wù)時(shí)可以用到反射;反射主要應(yīng)用與類(lèi)庫(kù),這些類(lèi)庫(kù)需要知道一個(gè)類(lèi)型的定義,以便提供更多的功能。調(diào)用AppDomain對(duì)象的GetAssemblies方法將返回一個(gè)由System.Reflection.Assembly元素組成的數(shù)組。顯示的調(diào)用一個(gè)程序集,system.reflecton.assembly類(lèi)型提供了下面三種

6、方法:1 .Load方法:極力推薦的一種方法,Load方法帶有一個(gè)程序集標(biāo)志并載入它,Load將引起CLR把策略應(yīng)用到程序集上,先后在全局程序集緩沖區(qū),應(yīng)用程序基目錄和私有路徑下面查找該程序集,如果找不到該程序集系統(tǒng)拋出異常。2 .LoadFrom方法:傳遞一個(gè)程序集文件的路徑名(包括擴(kuò)展名),CLR會(huì)載入您指定的這個(gè)程序集,傳遞的這個(gè)參數(shù)不能包含任何關(guān)于版本號(hào)的信息,區(qū)域性,和公鑰信息,如果在指定路徑找不到程序集拋出異常。3 .LoadWithPartialName:永遠(yuǎn)不要使用這個(gè)方法,因?yàn)閼?yīng)用程序不能確定再在載入的程序集的版本。該方法的唯一用途是幫助那些在.Net框架的測(cè)試環(huán)節(jié)使用.ne

7、t框架提供的某種行為的客戶,這個(gè)方法將最終被拋棄不用。如果你想要獲得一個(gè)類(lèi)型繼承的所有接口集合,可以調(diào)用Type的FindInterfacesGetInterface或者GetInterfaces。所有這些方法只能返回該類(lèi)型直接繼承的接口,他們不會(huì)返回從一個(gè)接口繼承下來(lái)的接口。要想返回接口的基礎(chǔ)接口必須再次調(diào)用上述方法。使用反射來(lái)調(diào)用類(lèi)型或者觸發(fā)方法,或者訪問(wèn)一個(gè)字段或者屬性時(shí)clr需要做更多的工作:校驗(yàn)參數(shù),檢查權(quán)限等等,所以速度是非常慢的。所以盡量不要使用反射進(jìn)行編程,對(duì)于打算編寫(xiě)一個(gè)動(dòng)態(tài)構(gòu)造類(lèi)型(晚綁定)的應(yīng)用程序,可以采取以下的幾種方式進(jìn)行代替:1 .通過(guò)類(lèi)的繼承關(guān)系。讓該類(lèi)型從一個(gè)編譯時(shí)可知的基礎(chǔ)類(lèi)型派生出來(lái),在運(yùn)行時(shí)生成該類(lèi)型的一個(gè)實(shí)例,將對(duì)其的引用放到其基礎(chǔ)類(lèi)型的一個(gè)變量中,然后調(diào)用該基礎(chǔ)類(lèi)型的虛方法。2 .通過(guò)接口實(shí)現(xiàn)。在運(yùn)行時(shí),構(gòu)建該類(lèi)型的一個(gè)實(shí)例,將對(duì)其的引用放到其接口類(lèi)型的一個(gè)變量中,然后調(diào)用該接口定義的虛方法。3 .通過(guò)委托實(shí)現(xiàn)。讓該類(lèi)型實(shí)現(xiàn)一個(gè)方法,其名稱(chēng)和原型都與一個(gè)在編譯時(shí)就已知的委托相符。在運(yùn)行時(shí)先構(gòu)造該類(lèi)型的實(shí)例,然后在用該方法的對(duì)象及名稱(chēng)構(gòu)造出該委托的實(shí)例,接著通過(guò)委托調(diào)用你想要的方法

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論