關(guān)于C#中的反射機制

轉(zhuǎn)自博客園

反射是.NET中的重要機制埋同,通過反射劳较,可以在運行時獲得程序或程序集中每一個類型(包括類驹止、結(jié)構(gòu)、委托观蜗、接口和枚舉等)的成員和成員的信息臊恋。有了反射,即可對每一個類型了如指掌墓捻。另外我還可以直接創(chuàng)建對象抖仅,即使這個對象的類型在編譯時還不知道。


反射的用途

1).使用Assembly定義和加載程序集砖第,加載在程序集清單中列出模塊撤卢,以及從此程序集中查找類型并創(chuàng)建該類型的實例。

2).使用Module了解包含模塊的程序集以及模塊中的類等梧兼,還可以獲取在模塊中定義的所有全局方法或其他特定的非全局方法放吩。

3).使用ConstructorInfo了解構(gòu)造函數(shù)的名稱、參數(shù)羽杰、訪問修飾符(如public或private)和實現(xiàn)詳細(xì)信息(如abstract或virtual)等屎慢。

4).使用MethodInfo了解方法的名稱瞭稼、返回類型忽洛、參數(shù)腻惠、訪問修飾符(如public和private)和實現(xiàn)詳細(xì)信息(如abstract或virtual)等。

5).使用FiedInfo了解字段的名稱欲虚、訪問修飾符(如public和private)和實現(xiàn)詳細(xì)信息(如static)等集灌,并獲取或設(shè)置字段值。

6).使用EventInfo了解事件的名稱复哆、事件處理程序數(shù)據(jù)類型欣喧、自定義屬性、聲明類型和反射類型等梯找,添加或移除事件處理程序唆阿。

7).使用PropertyInfo了解屬性的名稱、數(shù)據(jù)類型锈锤、聲明類型驯鳖、反射類型和只讀或可寫狀態(tài)等,獲取或設(shè)置屬性值久免。

8).?使用ParameterInfo了解參數(shù)的名稱浅辙、數(shù)據(jù)類型、是輸入?yún)?shù)還是輸出參數(shù)阎姥,以及參數(shù)在方法簽名中的位置等记舆。


反射用到得到命名空間:

System.Reflection? ? System.Type? ?System.Reflection.Assembly

反射用到的主要類:

System.Type類? --通過這個類可以訪問任何給定數(shù)據(jù)類型的信息。

System.Reflection.Assembly類 --它可以用于訪問給定程序集的信息呼巴,或者把這個程序集加載到程序中泽腮。

System.Type類:

? ? System.Type類對于反射起核心作用。但它是一個抽象的基類衣赶,Type有與每種數(shù)據(jù)類型對應(yīng)的派生類诊赊,我們使用這個派生類的對象的方法、字段屑埋、屬性來查找有關(guān)該類型的所有信息豪筝。

獲取給定類型的Type引用有3種常用方式:

? ? 使用C#?typeof運算符:

? ? ? ? ? ? ? ? ? ? Type t = typeof(string);

? ? 使用對象GetType()方法。

? ? ? ? ? ? ? ? ? ? string s = "grayworm";

? ? ? ? ? ? ? ? ? ? Type t = s.GetType();

? ? ?調(diào)用Type類的靜態(tài)方法GetType()摘能。

? ? ? ? ? ? ? ? ? ? Type t = Type.GetType("System.String");


Type類的屬性:

????????Name 數(shù)據(jù)類型名

??????? FullName 數(shù)據(jù)類型的完全限定名(包括命名空間名)

??????? Namespace 定義數(shù)據(jù)類型的命名空間名

??????? IsAbstract 指示該類型是否是抽象類型

??????? IsArray?? 指示該類型是否是數(shù)組

??????? IsClass?? 指示該類型是否是類

??????? IsEnum?? 指示該類型是否是枚舉

??????? IsInterface??? 指示該類型是否是接口

??????? IsPublic 指示該類型是否是公有的

??????? IsSealed 指示該類型是否是密封類

??????? IsValueType 指示該類型是否是值類型

?Type類的方法:? ? ??

?????GetConstructor(), GetConstructors():

????????返回ConstructorInfo類型续崖,用于取得該類的構(gòu)造函數(shù)的信息

??????? GetEvent(), GetEvents():返回EventInfo類型,用于取得該類的事件的信息

??????? GetField(), GetFields():返回FieldInfo類型团搞,用于取得該類的字段(成員變量)的信息

??????? GetInterface(), GetInterfaces():返回InterfaceInfo類型严望,用于取得該類實現(xiàn)的接口的信息

??????? GetMember(), GetMembers():返回MemberInfo類型,用于取得該類的所有成員的信息

??????? GetMethod(), GetMethods():返回MethodInfo類型逻恐,用于取得該類的方法的信息

??????? GetProperty(), GetProperties():返回PropertyInfo類型像吻,用于取得該類的屬性的信息

??? 可以調(diào)用這些成員峻黍,其方式是調(diào)用Type的InvokeMember()方法,或者調(diào)用MethodInfo, PropertyInfo和其他類的Invoke()方法

用構(gòu)造函數(shù)動態(tài)生成對象:

?? ??Type t = typeof(NewClassw);

????????Type[] pt = new Type[2];

??????? pt[0] = typeof(string);

??????? pt[1] = typeof(string);

??????? //根據(jù)參數(shù)類型獲取構(gòu)造函數(shù)?

????????ConstructorInfo ci = t.GetConstructor(pt);

??????? //構(gòu)造Object數(shù)組拨匆,作為構(gòu)造函數(shù)的輸入?yún)?shù)?

????????object[] obj = new object[2]{"grayworm","hi.baidu.com/grayworm"};???

??????? //調(diào)用構(gòu)造函數(shù)生成對象?

????????object o = ci.Invoke(obj);

??????? //調(diào)用生成的對象的方法測試是否對象生成成功?

??????? //((NewClassw)o).show();????

System.Reflection.Assembly類?

???? Assembly類可以獲得程序集的信息姆涩,也可以動態(tài)的加載程序集,以及在程序集中查找類型信息惭每,并創(chuàng)建該類型的實例骨饿。

??? 使用Assembly類可以降低程序集之間的耦合,有利于軟件結(jié)構(gòu)的合理化台腥。


????通過程序集名稱返回Assembly對象

????Assembly ass = Assembly.Load("ClassLibrary831");

????通過DLL文件名稱返回Assembly對象

????Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");

????通過Assembly獲取程序集中類

????Type t = ass.GetType("ClassLibrary831.NewClass");?? //參數(shù)必須是類的全名

????通過Assembly獲取程序集中所有的類

????Type[] t = ass.GetTypes();

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宏赘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子黎侈,更是在濱河造成了極大的恐慌察署,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峻汉,死亡現(xiàn)場離奇詭異贴汪,居然都是意外死亡,警方通過查閱死者的電腦和手機俱济,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門嘶是,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛛碌,你說我怎么就攤上這事聂喇。” “怎么了蔚携?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵希太,是天一觀的道長。 經(jīng)常有香客問我酝蜒,道長誊辉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任亡脑,我火速辦了婚禮堕澄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霉咨。我一直安慰自己蛙紫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布途戒。 她就那樣靜靜地躺著坑傅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喷斋。 梳的紋絲不亂的頭發(fā)上唁毒,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天蒜茴,我揣著相機與錄音,去河邊找鬼浆西。 笑死粉私,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的室谚。 我是一名探鬼主播毡鉴,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秒赤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起憎瘸,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤入篮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幌甘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潮售,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年锅风,在試婚紗的時候發(fā)現(xiàn)自己被綠了酥诽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡皱埠,死狀恐怖肮帐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情边器,我是刑警寧澤训枢,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站忘巧,受9級特大地震影響恒界,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砚嘴,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一十酣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧际长,春花似錦耸采、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翅娶,卻和暖如春文留,著一層夾襖步出監(jiān)牢的瞬間好唯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工燥翅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留骑篙,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓森书,卻偏偏與公主長得像靶端,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凛膏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理杨名,服務(wù)發(fā)現(xiàn),斷路器猖毫,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 今天稍微看了下反射的東西台谍,雖然還不是很明白,但也寫寫隨筆吁断,加深下印象趁蕊。 1、反射是什么東西仔役? Refl...
    北風(fēng)知我意閱讀 1,218評論 0 0
  • 一掷伙、概述 Java反射機制定義 Java反射機制是在運行狀態(tài)中,對于任意一個類又兵,都能夠知道這個類中的所有屬性和方法...
    CoderZS閱讀 1,632評論 0 26
  • 第120天《讓生命微微笑》實修 主題:永恒之路 功課:轉(zhuǎn)圈圈 地球自轉(zhuǎn)一圈為一天任柜,地球繞著太陽轉(zhuǎn)一圈為一年,月球自...
    01零壹閱讀 216評論 0 1
  • 昨夜秋辭寒波,今日冬回乘盼。嘆霜菊、將換寒梅俄烁。 涼風(fēng)院落绸栅,冷雨窗扉。擾案中書页屠,杯中影粹胯,夢中誰。 懶添妝色辰企,疏描遠(yuǎn)黛风纠,任步搖...
    當(dāng)初不該下凡閱讀 985評論 5 14