本文鏈接:https://blog.csdn.net/weixin_44370124/article/details/90645493
今天和大家聊一聊c#中的反射問(wèn)題, 和一些他的優(yōu)點(diǎn) 以及缺點(diǎn)。
這些是自己在一些學(xué)習(xí)資料中收集的一些理論知識(shí),希望大家多多補(bǔ)充。
反射指程序可以訪(fǎng)問(wèn)、檢測(cè)和修改它本身狀態(tà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)型的方法或訪(fǎng)問(wèn)其字段和屬性。
有關(guān)程序及其類(lèi)型的數(shù)據(jù)被稱(chēng)為元數(shù)據(jù)(metadata),它們保存在程序的程序集中。
程序在運(yùn)行時(shí),可以查看其他程序集或其本身的元數(shù)據(jù)。一個(gè)運(yùn)行的程序査看本身的元數(shù)據(jù)或其他程序的元數(shù)據(jù)的行為叫做反射(reflection).
反射(Reflection)的用途
1.它允許在運(yùn)行時(shí)查看特性(attribute)信息。
2.它允許審查集合中的各種類(lèi)型,以及實(shí)例化這些類(lèi)型。
3.它允許延遲綁定的方法和屬性(property)。
4.它允許在運(yùn)行時(shí)創(chuàng)建新類(lèi)型,然后使用這些類(lèi)型執(zhí)行一些任務(wù)。
type類(lèi)的部分成員:

反射獲取方法及執(zhí)行:
1.獲取類(lèi)型信息Type type = my.GetType();
2.根據(jù)類(lèi)型創(chuàng)建對(duì)象Activator.CreateInstance(type);
3.獲取方法的信息 type.GetMethod(“MyFun”);
4.調(diào)用方法的一些標(biāo)志位BindingFlags.Public
5.執(zhí)行方法method.Invoke
反射獲取屬性:
1.獲取類(lèi)型信息Type type = my.GetType();
2.根據(jù)類(lèi)型創(chuàng)建對(duì)象Activator.CreateInstance(type);
3.獲取屬性名 type.GetProperty(“Number”)
4.獲取屬性值SetValue(dObj,100,null)
反射程序集
Assembly.LoadFile :方法可以從指定文件中加載程序集,通過(guò)查找程序集的AssemblyRef元數(shù)據(jù)表,得知所有引用和需要的程序集
與 Assembly.LoadFrom:從一個(gè)指定文件中加載程序集,它和LoadFrom()的不同之處在于LoadFile()不會(huì)加載目標(biāo)程序集所引用和依賴(lài)的其他程序集。需要自己控制并顯示加載所有依賴(lài)的程序集
綁定:在使用類(lèi)(實(shí)例化類(lèi)并使用類(lèi)的實(shí)例)的程序集與定義類(lèi)的程序集之間會(huì)建立一個(gè)聯(lián)系。這個(gè)聯(lián)系就是是使用類(lèi)的程序集對(duì)類(lèi)中的方法調(diào)用與與定義類(lèi)的程序集中的物理地址之間的對(duì)應(yīng)關(guān)系。通過(guò)這個(gè)聯(lián)系,類(lèi)的方法被調(diào)用時(shí)線(xiàn)程才能繼續(xù)執(zhí)行下去。
前期綁定:由編譯器在根據(jù).Net源代碼創(chuàng)建程序集的期間創(chuàng)建。相當(dāng)于直接引用一個(gè)類(lèi),聲明并實(shí)例化。
后期綁定:使用類(lèi)的程序集在編譯的時(shí)候并沒(méi)有引用定義類(lèi)的程序集中的類(lèi)型。
綁定是在代碼執(zhí)行期間而非編譯期。:失去IDE對(duì)語(yǔ)法的驗(yàn)證
程序集的定義:.NET應(yīng)用程序執(zhí)行的最小單位例如.dll,.exe
優(yōu)點(diǎn):
1、反射提高了程序的靈活性和擴(kuò)展性。
2、降低耦合性,提高自適應(yīng)能力。
3、它允許程序創(chuàng)建和控制任何類(lèi)的對(duì)象,無(wú)需提前硬編碼目標(biāo)類(lèi)。
缺點(diǎn):
1、性能問(wèn)題:使用反射基本上是一種解釋操作,用于字段和方法接入時(shí)要遠(yuǎn)慢于直接代碼。因此反射機(jī)制主要應(yīng)用在對(duì)靈活性和拓展性要求很高的系統(tǒng)框架上,普通程序不建議使用。
2、使用反射會(huì)模糊程序內(nèi)部邏輯;程序員希望在源代碼中看到程序的邏輯,反射卻繞過(guò)了源代碼的技術(shù),因而會(huì)帶來(lái)維護(hù)的問(wèn)題,反射代碼比相應(yīng)的直接代碼更復(fù)雜。