下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、window 命令大全反射的概述:反射的定義:審查元數(shù)據(jù)并收集關(guān)丁它的類型信息的能力。元數(shù)據(jù) (編譯以后的最基本數(shù)據(jù)單元)就是一大堆的表,當(dāng)編譯程序集或者模塊時,編譯器會創(chuàng)建一個類定義表,一個字段定義表,和一個方法定義表等,。 System.reflection命名空間包含的幾個類,允許你反射(解析)這些元數(shù)據(jù)表的代碼System.Reflection.AssemblySystem.Reflection.MemberInfoSystem.Reflection.EventInfoSystem.Reflection.FieldInfoSystem.Reflection.MethodBaseSyst
2、em.Reflection.ConstructorInfoSystem.Reflection.MethodInfoSystem.Reflection.PropertyInfoSystem.Type反射的層次模型:(注:層次問都是一對多的關(guān)系)反射的作用:1、可以使用反射動態(tài)地創(chuàng)建類型的實例,將類型綁定到現(xiàn)有對象,或從現(xiàn)有對象中獲取類型2、應(yīng)用程序需要在運行時從某個特定的程序集中載入一個特定的類型,以便實 現(xiàn)某個任務(wù)時可以用到反射。3、反射主要應(yīng)用與類庫,這些類庫需要知道一個類型的定義,以便提供更多的 功能。應(yīng)用要點:1、現(xiàn)實應(yīng)用程序中很少有應(yīng)用程序需要使用反射類型2、使用反射動態(tài)綁定需要犧牲性
3、能3、有些元數(shù)據(jù)信息是不能通過反射獲取的4、某些反射類型是專門為那些 clr開發(fā)編譯器的開發(fā)使用的, 所以你要意識 到不是所有的反射類型都是適合每個人的。反射 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對象的 GetAssemblies 方法將返回一個由System.Reflection.Assembly元素組成的數(shù)組。反射單個程序集:上面的方法講的是反射 AppDomain的所有程序集,我們可以顯示的調(diào)用其中的一個程序集,system.reflecton.assembly類型提供了下面三種方法:1、 Load方法:極力推薦的一種方法,Load方法帶有一個程序集標(biāo)志并載入它, Load將引起 CLR把策略應(yīng)用到程序集上,先后在全局程序集緩沖區(qū),應(yīng)用程序 基目錄和私有路徑下面查找該程序集,如果找不到該程序集系統(tǒng)拋出異常2、 LoadFrom方法:傳遞一個程序集文件的路徑名(包括擴(kuò)展名)
5、,CLR載 入您指定的這個程序集,傳遞的這個參數(shù)不能包含任何關(guān)于版本號的信息,區(qū) 域性,和公鑰信息,如果在指定路徑找不到程序集拋出異常。3、LoadWithPartialName :永遠(yuǎn)不要使用這個方法,因為應(yīng)用程序不能確定再在載入的程序集的版本。該方法的唯一用途是幫助那些在.Net框架的測試環(huán)節(jié)使用.net框架提供的某種行為的客戶,這個方法將最終被拋棄不用。注意:system.AppDomain 也提供了一種 Load方法,他和 Assembly 的靜態(tài)Load方法不一樣,AppDomain 的 load 方法是一種實例方法,返回的是一個對 程序集的引用,Assembly 的靜態(tài) Load
6、方發(fā)將程序集按值封裝發(fā)回給發(fā)出調(diào)用的AppDomain盡量避免使用 AppDomain 的 load 方法利用反射獲取類型信息:前面講完了關(guān)于程序集的反射,下面在講一下反射層次模型中的第三個層次, 類型反射一個簡單的利用反射獲取類型信息的例子:using system;using sytem.reflection;class reflectingstatic void Main(stringargs)reflecting reflect=new reflecting();/調(diào)用一個 reflecting.exe 程序集定義一個新的自身類assembly myAssembly=assembly.
7、loadfrom( “reflecting.exe ” )reflect.getreflectioninfo(myAssembly);/定義一個獲取反射內(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對象的方法:1、 System.type參數(shù)為字符申類型,該字符申必須指定類型的完整名稱(包括其命名空間)2、System.type 提供了兩個實例方法:GetNestedType,GetNestedTypes3、 Syetem.Reflection.Assembly類型提供的實例方法是:GetTy
9、pe,GetTypes,GetExporedTypes4、 System.Reflection.Moudle提供了這些實例方法:GetType,GetTypes,FindTypes設(shè)置反射類型的成員:反射類型的成員就是反射層次模型中最下面的一層數(shù)據(jù)。我們可以通過 type對 象的GetMembers方法取得一個類型的成員。如果我們使用的是不帶參數(shù)的 GetMembers它只返回該類型的公共定義的靜態(tài)變量和實例成員,我們也可以 通過使用帶參數(shù)的GetMembers過參數(shù)設(shè)置來返回指定的類型成員。具體參數(shù) 參考 msdn 中system.reflection.bindingflags枚舉類型的詳細(xì)
10、說明。例如:/設(shè)置需要返回的類型的成員內(nèi)容獲取反射信息獲取類型針對每個類型獲取詳細(xì)信息bindingFlagsbf=bingdingFlags.DeclaredOnly|bingdingFlags.Nonpublic|BingdingFlags.P ublic;foreach (MemberInfo mi int t.getmembers(bf)writeline(mi.membertype) /輸出指定的類型成員通過反射創(chuàng)建類型的實例:通過反射可以獲取程序集的類型,我們就可以根據(jù)獲得的程序集類型來創(chuàng)建該 類型新的實例,這也是前面提到的在運行時創(chuàng)建對象實現(xiàn)晚綁定的功能 我們可以通過下面的幾個方
11、法實現(xiàn):1、System.Activator 的 CreateInstance 方法。該方法返回新對象的引用。具體使用方法參見 msnd2、System.Activator的createInstanceFrom 與上一個方法類似,不過需要指定類型及其程序集3、System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom 和CreateInstraceFromAndUnwrap4、System.type的 InvokeMember實例方法:這個方法返回一個與傳入?yún)?shù)相符的構(gòu)造函數(shù),并構(gòu)造該類型。5、
12、System.reflection.constructinfo 的 Invoke 實例方法反射類型的接口:如果你想要獲得一個類型繼承的所有接口集合,可以調(diào)用Type的FindInterfaces GetInterface 或者 GetInterfaces 。所有這些方法只能返回該 類型直接繼承的接口,他們不會返回從一個接口繼承下來的接口。要想返回接 口的基礎(chǔ)接口必須再次調(diào)用上述方法。反射的性能:使用反射來調(diào)用類型或者觸發(fā)方法,或者訪問一個字段或者屆性時clr需要做更多的工作:校驗參數(shù),檢查權(quán)限等等,所以速度是非常慢的。所以盡量不 要使用反射進(jìn)行編程,對于打算編寫一個動態(tài)構(gòu)造類型(晚綁定)的應(yīng)用程序,可以采取以下的幾種方式進(jìn)行代替:1、通過類的繼承關(guān)系。讓該類型從一個編譯時可知的基礎(chǔ)類型派生出來,在運 行時生成該類型的一個實例,將對其的引用放到其基礎(chǔ)類型的一個變量中,然 后調(diào)用該基礎(chǔ)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025車輛保管合同書范文
- 2025保修工程合同范本
- 2025學(xué)校食堂承包合同書
- 2025關(guān)于試用期解除合同及案例
- 2025年度軍事電子對抗保密技術(shù)合同3篇
- 2025年度新能源充電設(shè)施建設(shè)公司合作協(xié)議書3篇
- 二零二五年度農(nóng)村房屋租賃合同(含農(nóng)業(yè)產(chǎn)業(yè)升級)
- 二零二五年度體育場館租賃合同及賽事運營協(xié)議3篇
- 2025年度農(nóng)村個人地基使用權(quán)轉(zhuǎn)讓及農(nóng)業(yè)現(xiàn)代化設(shè)施配套協(xié)議書3篇
- 2025年度教育信息化項目經(jīng)理合作協(xié)議2篇
- 醫(yī)院科室合作共建協(xié)議 醫(yī)院科室合作協(xié)議書
- 醫(yī)務(wù)人員感染性職業(yè)暴露登記表
- qc成果提高剪力墻層間混凝土一次驗收合格率
- 比賽獲獎?wù)n件-I-love-My-White-Shoes(繪本)
- 初中生物-《植物的生殖與發(fā)育》教學(xué)課件設(shè)計
- 手機(jī)大腦:讓人睡眠好、心情好、腦力好的戒手機(jī)指南
- 中考數(shù)學(xué)第一輪復(fù)習(xí)
- 一汽靖燁發(fā)動機(jī)有限公司安全文化知識手冊
- 湘賀水利樞紐水電站設(shè)計
- 高壓線防護(hù)架搭設(shè)施工方案
- 四川省成都市2021-2022學(xué)年高一(上)期末調(diào)研考試物理試題Word版含解析
評論
0/150
提交評論