



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、window 命令大全反射的概述:反射的定義:審查元數(shù)據(jù)并收集關(guān)丁它的類型信息的能力。元數(shù)據(jù) (編譯以后的最基本數(shù)據(jù)單元)就是一大堆的表,當(dāng)編譯程序集或者模塊時(shí),編譯器會(huì)創(chuàng)建一個(gè)類定義表,一個(gè)字段定義表,和一個(gè)方法定義表等,。 System.reflection命名空間包含的幾個(gè)類,允許你反射(解析)這些元數(shù)據(jù)表的代碼System.Reflection.AssemblySystem.Reflection.MemberInfoSystem.Reflection.EventInfoSystem.Reflection.FieldInfoSystem.Reflection.MethodBaseSyst
2、em.Reflection.ConstructorInfoSystem.Reflection.MethodInfoSystem.Reflection.PropertyInfoSystem.Type反射的層次模型:(注:層次問都是一對(duì)多的關(guān)系)反射的作用:1、可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類型2、應(yīng)用程序需要在運(yùn)行時(shí)從某個(gè)特定的程序集中載入一個(gè)特定的類型,以便實(shí) 現(xiàn)某個(gè)任務(wù)時(shí)可以用到反射。3、反射主要應(yīng)用與類庫,這些類庫需要知道一個(gè)類型的定義,以便提供更多的 功能。應(yīng)用要點(diǎn):1、現(xiàn)實(shí)應(yīng)用程序中很少有應(yīng)用程序需要使用反射類型2、使用反射動(dòng)態(tài)綁定需要犧牲性
3、能3、有些元數(shù)據(jù)信息是不能通過反射獲取的4、某些反射類型是專門為那些 clr開發(fā)編譯器的開發(fā)使用的, 所以你要意識(shí) 到不是所有的反射類型都是適合每個(gè)人的。反射 appDomain的程序集:當(dāng)你需要反射 AppDomain中包含的所有程序集,示例如下:static void Main/ 通過 GetAssemblies調(diào)用 appDomain 的所有程序集 foreach (Assembly assem inAppdomain.currentDomain.GetAssemblies()/反射當(dāng)前程序集的信息reflector.ReflectOnAssembly(assem)說明:調(diào)用 AppDo
4、main對(duì)象的 GetAssemblies 方法將返回一個(gè)由System.Reflection.Assembly元素組成的數(shù)組。反射單個(gè)程序集:上面的方法講的是反射 AppDomain的所有程序集,我們可以顯示的調(diào)用其中的一個(gè)程序集,system.reflecton.assembly類型提供了下面三種方法:1、 Load方法:極力推薦的一種方法,Load方法帶有一個(gè)程序集標(biāo)志并載入它, Load將引起 CLR把策略應(yīng)用到程序集上,先后在全局程序集緩沖區(qū),應(yīng)用程序 基目錄和私有路徑下面查找該程序集,如果找不到該程序集系統(tǒng)拋出異常2、 LoadFrom方法:傳遞一個(gè)程序集文件的路徑名(包括擴(kuò)展名)
5、,CLR載 入您指定的這個(gè)程序集,傳遞的這個(gè)參數(shù)不能包含任何關(guān)于版本號(hào)的信息,區(qū) 域性,和公鑰信息,如果在指定路徑找不到程序集拋出異常。3、LoadWithPartialName :永遠(yuǎn)不要使用這個(gè)方法,因?yàn)閼?yīng)用程序不能確定再在載入的程序集的版本。該方法的唯一用途是幫助那些在.Net框架的測(cè)試環(huán)節(jié)使用.net框架提供的某種行為的客戶,這個(gè)方法將最終被拋棄不用。注意:system.AppDomain 也提供了一種 Load方法,他和 Assembly 的靜態(tài)Load方法不一樣,AppDomain 的 load 方法是一種實(shí)例方法,返回的是一個(gè)對(duì) 程序集的引用,Assembly 的靜態(tài) Load
6、方發(fā)將程序集按值封裝發(fā)回給發(fā)出調(diào)用的AppDomain盡量避免使用 AppDomain 的 load 方法利用反射獲取類型信息:前面講完了關(guān)于程序集的反射,下面在講一下反射層次模型中的第三個(gè)層次, 類型反射一個(gè)簡(jiǎn)單的利用反射獲取類型信息的例子:using system;using sytem.reflection;class reflectingstatic void Main(stringargs)reflecting reflect=new reflecting();/調(diào)用一個(gè) reflecting.exe 程序集定義一個(gè)新的自身類assembly myAssembly=assembly.
7、loadfrom( “reflecting.exe ” )reflect.getreflectioninfo(myAssembly);/定義一個(gè)獲取反射內(nèi)容的方法void getreflectioninfo(assembly myassembly) type typearr=myassemby.Gettypes();/ foreach(type type in typearr)/ /獲取類型的結(jié)構(gòu)信息constructorinfomyconstructors=type.GetConstructors;/獲取類型的字段信息fieldinfo myfields=type.GetFiedls()/獲
8、取方法信息Methodinfo myMethodInfo=type.GetMethods();/獲取屆性信息propertyinfo myproperties=type.GetProperties/獲取事件信息EventInfo Myevents=type.GetEvents;其它幾種獲取 type對(duì)象的方法:1、 System.type參數(shù)為字符申類型,該字符申必須指定類型的完整名稱(包括其命名空間)2、System.type 提供了兩個(gè)實(shí)例方法:GetNestedType,GetNestedTypes3、 Syetem.Reflection.Assembly類型提供的實(shí)例方法是:GetTy
9、pe,GetTypes,GetExporedTypes4、 System.Reflection.Moudle提供了這些實(shí)例方法:GetType,GetTypes,FindTypes設(shè)置反射類型的成員:反射類型的成員就是反射層次模型中最下面的一層數(shù)據(jù)。我們可以通過 type對(duì) 象的GetMembers方法取得一個(gè)類型的成員。如果我們使用的是不帶參數(shù)的 GetMembers它只返回該類型的公共定義的靜態(tài)變量和實(shí)例成員,我們也可以 通過使用帶參數(shù)的GetMembers過參數(shù)設(shè)置來返回指定的類型成員。具體參數(shù) 參考 msdn 中system.reflection.bindingflags枚舉類型的詳細(xì)
10、說明。例如:/設(shè)置需要返回的類型的成員內(nèi)容獲取反射信息獲取類型針對(duì)每個(gè)類型獲取詳細(xì)信息bindingFlagsbf=bingdingFlags.DeclaredOnly|bingdingFlags.Nonpublic|BingdingFlags.P ublic;foreach (MemberInfo mi int t.getmembers(bf)writeline(mi.membertype) /輸出指定的類型成員通過反射創(chuàng)建類型的實(shí)例:通過反射可以獲取程序集的類型,我們就可以根據(jù)獲得的程序集類型來創(chuàng)建該 類型新的實(shí)例,這也是前面提到的在運(yùn)行時(shí)創(chuàng)建對(duì)象實(shí)現(xiàn)晚綁定的功能 我們可以通過下面的幾個(gè)方
11、法實(shí)現(xiàn):1、System.Activator 的 CreateInstance 方法。該方法返回新對(duì)象的引用。具體使用方法參見 msnd2、System.Activator的createInstanceFrom 與上一個(gè)方法類似,不過需要指定類型及其程序集3、System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom 和CreateInstraceFromAndUnwrap4、System.type的 InvokeMember實(shí)例方法:這個(gè)方法返回一個(gè)與傳入?yún)?shù)相符的構(gòu)造函數(shù),并構(gòu)造該類型。5、
12、System.reflection.constructinfo 的 Invoke 實(shí)例方法反射類型的接口:如果你想要獲得一個(gè)類型繼承的所有接口集合,可以調(diào)用Type的FindInterfaces GetInterface 或者 GetInterfaces 。所有這些方法只能返回該 類型直接繼承的接口,他們不會(huì)返回從一個(gè)接口繼承下來的接口。要想返回接 口的基礎(chǔ)接口必須再次調(diào)用上述方法。反射的性能:使用反射來調(diào)用類型或者觸發(fā)方法,或者訪問一個(gè)字段或者屆性時(shí)clr需要做更多的工作:校驗(yàn)參數(shù),檢查權(quán)限等等,所以速度是非常慢的。所以盡量不 要使用反射進(jìn)行編程,對(duì)于打算編寫一個(gè)動(dòng)態(tài)構(gòu)造類型(晚綁定)的應(yīng)用程序,可以采取以下的幾種方式進(jìn)行代替:1、通過類的繼承關(guān)系。讓該類型從一個(gè)編譯時(shí)可知的基礎(chǔ)類型派生出來,在運(yùn) 行時(shí)生成該類型的一個(gè)實(shí)例,將對(duì)其的引用放到其基礎(chǔ)類型的一個(gè)變量中,然 后調(diào)用該基礎(chǔ)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- AR游戲未來發(fā)展趨勢(shì)分析及投資規(guī)劃建議研究報(bào)告
- 2024河南道路貨物運(yùn)輸市場(chǎng)前景及投資研究報(bào)告
- 2025年度租賃房屋押金退還服務(wù)合同-@-1
- 2025年度變電站電力設(shè)施環(huán)保評(píng)估合同
- 2025年隔膜式計(jì)量泵項(xiàng)目可行性研究報(bào)告
- 五金焊絲行業(yè)深度研究報(bào)告
- 2025年中國家用壁紙市場(chǎng)行情動(dòng)態(tài)分析及發(fā)展前景趨勢(shì)預(yù)測(cè)報(bào)告
- 人教版八年級(jí)歷史與社會(huì)上冊(cè):1.1.1原始先民的家園 教學(xué)設(shè)計(jì)
- 2025年基板扦入輸送機(jī)項(xiàng)目可行性研究報(bào)告
- 紅酒按揭合同范本
- 政務(wù)信息工作先進(jìn)單位事跡材料
- 道路建筑材料電子教案(全)
- 《一頁紙項(xiàng)目管理》中文模板
- 《淡水養(yǎng)殖基礎(chǔ)知識(shí)》
- 英語演講-機(jī)器人發(fā)展
- 1、1~36號(hào)元素電子排布式、排布圖
- advantrol-pro v2.70學(xué)習(xí)版系統(tǒng)組態(tài)使用手冊(cè)
- 職業(yè)院校技能大賽沙盤模擬企業(yè)經(jīng)營賽項(xiàng)規(guī)程
- 職業(yè)衛(wèi)生調(diào)查表
- GB/T 11982.1-2005聚氯乙烯卷材地板第1部分:帶基材的聚氯乙烯卷材地板
- GB/T 10046-2018銀釬料
評(píng)論
0/150
提交評(píng)論