C#高階-反射

概念

反射機(jī)制是使程序具有動態(tài)特性的非常關(guān)鍵的一種機(jī)制

需求1:根據(jù)指定的類名梦碗,類字段名和所對應(yīng)的數(shù)據(jù),得到該類的實例担神。

需求2:根據(jù)指定的裝箱對象 獲取其屬性值或者調(diào)用其方法

需求3:獲取未來會產(chǎn)生的程序集 并使用其中的類

讓我們可以于運(yùn)行時加載黄选、探知、使用編譯期間完全未知的classes际插。換句話說,程序可以加載一個運(yùn)行時才得知名稱的class,獲悉其完整構(gòu)造(但不包括methods定義)率寡,并生成其對象實體、或?qū)ζ鋐ields設(shè)值倚搬、或喚起其methods1勇劣。

反射需要的類

反射用到的命名空間:

???System.Reflection

???System.Type

???System.Reflection.Assembly

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

? ?(2)使用Type這個類可以訪問任何給定數(shù)據(jù)類型的信息。

???(3)使用ConstructorInfo了解構(gòu)造函數(shù)的名稱盆犁、參數(shù)命咐、訪問修飾符(如pulic 或private)和實現(xiàn)詳細(xì)信息(如abstract或virtual)等。

???(4)使用MethodInfo了解方法的名稱谐岁、返回類型醋奠、參數(shù)、訪問修飾符(如pulic 或private)和實現(xiàn)詳細(xì)信息(如abstract或virtual)等伊佃。

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

???(6)使用PropertyInfo了解屬性的名稱塞祈、數(shù)據(jù)類型、聲明類型帅涂、反射類型和只讀或可寫狀態(tài)等议薪,獲取或設(shè)置屬性值尤蛮。

System.Type類:

???System.Type 類對于反射起著核心的作用。但它是一個抽象的基類斯议,Type有與每種數(shù)據(jù)類型對應(yīng)的派生類产捞,我們使用這個派生類的對象的方法、字段哼御、屬性來查找有關(guān)該類型的所有信息坯临。

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

???●使用 C# typeof 運(yùn)算符。已知類型

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

???●使用對象GetType()方法恋昼。 已知對象

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

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

???●還可以調(diào)用Type類的靜態(tài)方法GetType()看靠。已知類名

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

反射生成的對象

1.用Type構(gòu)建對象

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

既然有反射 那就有“正射”

對比一下:

有一個class Test ?有無參構(gòu)造方法

獲取實例的比較:

“正” :由類名直接使用關(guān)鍵字new來獲得 語法:new Test()

反射:未知類名 運(yùn)行時獲得類型名:例如:Type?type?=?Type.GetType("Test");

???Object o = type.GetConstructor (new Type[]{}).Invoke (null);

??當(dāng)然參數(shù)也可以由配置文件獲得

以上調(diào)用無參構(gòu)造 帶參的構(gòu)造怎么調(diào)用呢?

2.用Activator生成對象:

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

???????//構(gòu)造函數(shù)的參數(shù)

???????object[] obj = new object[2] { "實參1", "實參2" }; ??

???????//用Activator的CreateInstance靜態(tài)方法焰雕,生成新對象

???????object o = Activator.CreateInstance(t,obj);

3.Assembly生成對象:

Assembly assembly = Assembly.Load ("ReflectTest");

Object obj = assembly.CreateInstance ("ReflectTest.Wood");

反射獲取字段值

一般用于已知對象時使用

同樣用正反來做對比:

已知對象MyClass obj

對象內(nèi)有name這個字段

正:

obj.name = "xxx"即可設(shè)置該對象的值

obj.name即可獲得該對象的值

反射:

//獲取類的描述對象

Type t = obj.GetType();

//取得字段描述對象

FieldInfo fi = t.GetField("name");

//獲取或設(shè)置字段值

fi.SetValue(obj, "k001");

fi.GetValue(obj);

一般在C#中以屬性替代字段

//獲取類的描述對象

Type t = obj.GetType();

//取得屬性描述對象

PropertyInfo pi1 = t.GetProperty("Name");

//獲取或設(shè)置屬性值

pi1.SetValue(obj, "k001",null);

pi1.GetValue(obj,null);

反射執(zhí)行方法

一般用于對象衷笋、方法名、參數(shù)類型已知

對象:obj?

方法名:methodName

參數(shù)類型 String int

正:

直接給予參數(shù)調(diào)用:obj.methodName("實參1"矩屁,實參2(int))

反射:

//獲取類的描述對象

Type t = obj.GetType();

//取得方法描述對象

MethodInfo mi = t.GetMethod("show");

//調(diào)用方法

mi.Invoke(obj, "實參1"辟宗,實參2(int));

參數(shù)可以換成數(shù)組

動態(tài)載入程序集

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();


???//通過程序集的名稱反射

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

???Type t = ass.GetType("ClassLibrary831.NewClass");

???object o = Activator.CreateInstance(t, "", "");

???MethodInfo mi = t.GetMethod("show");

???mi.Invoke(o, null);

??//通過DLL文件全名反射其中的所有類型

???Assembly assembly = Assembly.LoadFrom("xxx.dll的路徑");

???Type[] aa = a.GetTypes();

???foreach(Type t in aa)

???{

???????if(t.FullName == "a.b.c")

???????{

???????????object o = Activator.CreateInstance(t);

???????}

???}

小結(jié)

反射屬于面向?qū)ο蟮膭討B(tài)補(bǔ)充

讓C#的面向?qū)ο笞龅?所見即所得"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市约郁,隨后出現(xiàn)的幾起案子缩挑,更是在濱河造成了極大的恐慌,老刑警劉巖鬓梅,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件供置,死亡現(xiàn)場離奇詭異,居然都是意外死亡绽快,警方通過查閱死者的電腦和手機(jī)芥丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坊罢,“玉大人续担,你說我怎么就攤上這事』詈ⅲ” “怎么了物遇?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我挎挖,道長这敬,這世上最難降的妖魔是什么航夺? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任蕉朵,我火速辦了婚禮,結(jié)果婚禮上阳掐,老公的妹妹穿的比我還像新娘始衅。我一直安慰自己,他們只是感情好缭保,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布汛闸。 她就那樣靜靜地躺著,像睡著了一般艺骂。 火紅的嫁衣襯著肌膚如雪诸老。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天钳恕,我揣著相機(jī)與錄音别伏,去河邊找鬼。 笑死忧额,一個胖子當(dāng)著我的面吹牛厘肮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睦番,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼类茂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了托嚣?” 一聲冷哼從身側(cè)響起巩检,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎示启,沒想到半個月后兢哭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡丑搔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年厦瓢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啤月。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡煮仇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谎仲,到底是詐尸還是另有隱情浙垫,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站夹姥,受9級特大地震影響杉武,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辙售,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一轻抱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旦部,春花似錦祈搜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婚度,卻和暖如春蘸秘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝗茁。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工醋虏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人评甜。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓灰粮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忍坷。 傳聞我的和親對象是個殘疾皇子粘舟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 什么是反射 反射 [Reflection]:是.Net中獲取運(yùn)行時類型信息的方式,.Net的應(yīng)用程序共有三個部分:...
    passiony閱讀 496評論 0 3
  • 轉(zhuǎn)自博客園 反射是.NET中的重要機(jī)制佩研,通過反射柑肴,可以在運(yùn)行時獲得程序或程序集中每一個類型(包括類、結(jié)構(gòu)旬薯、委托晰骑、接...
    極客詩人閱讀 940評論 0 0
  • 反射反射硕舆,程序員的快樂 這句話想必大家都經(jīng)常聽過,基本上在絕大多數(shù)的框架和一些設(shè)計模式中都能看到反射的身影(MVC...
    su9257_海瀾閱讀 17,133評論 0 24
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理骤公,服務(wù)發(fā)現(xiàn)抚官,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 快要過年了阶捆,你今年過年回家嗎凌节?你是怎么回家呢钦听?你回家需要多長時間呢?回家的路有多遠(yuǎn)?離開學(xué)校后就一直在路上倍奢,家更多...
    翎硯閱讀 382評論 0 0