《C#.net程序設(shè)計(jì)課件》課件-第七章 委托與事件、泛型和反射_第1頁(yè)
《C#.net程序設(shè)計(jì)課件》課件-第七章 委托與事件、泛型和反射_第2頁(yè)
《C#.net程序設(shè)計(jì)課件》課件-第七章 委托與事件、泛型和反射_第3頁(yè)
《C#.net程序設(shè)計(jì)課件》課件-第七章 委托與事件、泛型和反射_第4頁(yè)
《C#.net程序設(shè)計(jì)課件》課件-第七章 委托與事件、泛型和反射_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第七章

委托與事件、泛型和反射C#.net程序設(shè)計(jì)1本章主要內(nèi)容委托與事件泛型類(lèi),結(jié)構(gòu),接口和泛型成員可空類(lèi)型反射獲取和加載程序集,反射獲取類(lèi)型及其成員,調(diào)用實(shí)例方法2委托委托delegate是一種引用數(shù)據(jù)類(lèi)型,委托的對(duì)象實(shí)例中存放的是方法的引用。調(diào)用委托時(shí),它可以調(diào)用多個(gè)方法。這稱(chēng)為多路廣播。若要向委托的方法列表(調(diào)用列表)中添加額外的方法,只需使用加法運(yùn)算符或加法賦值運(yùn)算符(“+”或“+=”)添加兩個(gè)委托。若要從調(diào)用列表中移除方法,使用減法運(yùn)算符或減法賦值運(yùn)算符(“-”或“-=”)。下面通過(guò)實(shí)例演示使用加法運(yùn)算符“+”向委托的方法列表中添加額外的方法,以及使用減法運(yùn)算符“-”從調(diào)用列表中移除方法。委托與事件3事件概述

事件是類(lèi)在發(fā)生其關(guān)注的事情時(shí)用來(lái)提供通知的一種方式。引發(fā)事件的對(duì)象稱(chēng)為事件的源或發(fā)送者。對(duì)象引發(fā)事件的原因很多:例如按鈕單擊或菜單選擇等。事件具有以下特點(diǎn):事件是用來(lái)通知對(duì)象需要執(zhí)行某種操作的方式。事件通常用在圖形用戶(hù)界面中。事件通常使用委托事件處理程序進(jìn)行聲明。事件可以調(diào)用匿名方法來(lái)替代委托。委托與事件4使用事件

使用事件步驟是:聲明事件委托類(lèi)型定義、引發(fā)事件類(lèi)定義和接受事件類(lèi)訂閱事件。聲明事件委托類(lèi)型事件和方法一樣具有簽名,簽名包括名稱(chēng)和參數(shù)列表。事件的簽名通過(guò)委托類(lèi)型來(lái)定義,因此首先為事件聲明一個(gè)委托,如:publicdelegatevoidChangedEventHandler(objectsender,EventArgse);.NET框架中事件的簽名中,通常第一個(gè)參數(shù)為引用事件的源對(duì)象,第二個(gè)參數(shù)為一個(gè)傳送與事件相關(guān)的數(shù)據(jù)對(duì)象。并不強(qiáng)制使用這種形式,只要事件簽名返回void。委托與事件5使用事件在事件發(fā)送類(lèi)中添加事件,需要使用event關(guān)鍵字,并提供委托類(lèi)型和事件名稱(chēng)。例如:publiceventChangedEventHandlerChanged;引發(fā)事件類(lèi)定義 若要引發(fā)事件,類(lèi)可以調(diào)用委托,并傳遞所有與事件有關(guān)的參數(shù)。然后,委托調(diào)用已添加到該事件(如上例的Changed事件)的所有處理程序。例如下面代碼中:Changed(this,e);委托與事件6publicclassListWithChangedEvent:ArrayList//一個(gè)每次列表更改時(shí)發(fā)送通知的類(lèi){//事件,每當(dāng)列表元素更改時(shí),客戶(hù)端可利用該事件獲得通知。

publiceventChangedEventHandlerChanged;protectedvirtualvoidOnChanged(EventArgse)//每當(dāng)列表更改時(shí)調(diào)用Changed事件

{if(Changed!=null)//確保該事件不為空

Changed(this,e);//調(diào)用Changed事件

}//重寫(xiě)可更改列表的Add方法;在每個(gè)重寫(xiě)后調(diào)用事件

publicoverrideintAdd(objectvalue){inti=base.Add(value);//調(diào)用基類(lèi)ArrayList的Add方法

OnChanged(EventArgs.Empty);//觸發(fā)Changed事件

returni;}}7使用事件接受事件類(lèi)訂閱事件要接收某個(gè)事件的類(lèi)(如下面EventListener)可以創(chuàng)建一個(gè)方法來(lái)接收該事件,接收類(lèi)必須具有與事件具有相同簽名(如委托簽名)的方法,該方法(稱(chēng)為事件處理程序)可以采取適當(dāng)?shù)牟僮鱽?lái)響應(yīng)該事件,下例為L(zhǎng)istChanged方法。然后向引發(fā)事件類(lèi)實(shí)例的事件使用+=添加該方法的一個(gè)委托。即下例的List.Changed+=newChangedEventHandler(ListChanged);這個(gè)過(guò)程稱(chēng)為“訂閱事件”。

委托與事件8classEventListener{privateListWithChangedEventList;publicEventListener(ListWithChangedEventlist){List=list;//將“ListChanged”添加到“List”中的Changed事件。

List.Changed+=newChangedEventHandler(ListChanged);}//每當(dāng)列表更改時(shí)就會(huì)進(jìn)行以下調(diào)用。

privatevoidListChanged(objectsender,EventArgse){Console.WriteLine("事件觸發(fā)");}publicvoidDetach(){//分離事件并刪除列表

List.Changed-=newChangedEventHandler(ListChanged);List=null;}}9使用事件 在類(lèi)Test主函數(shù)Main()中創(chuàng)建引發(fā)事件類(lèi)實(shí)例和接受事件類(lèi)實(shí)例,代碼如下:classTest{//測(cè)試ListWithChangedEvent類(lèi)。

publicstaticvoidMain(){ //創(chuàng)建新列表,引發(fā)事件類(lèi)實(shí)例。

ListWithChangedEventlist=new ListWithChangedEvent();//創(chuàng)建一個(gè)類(lèi),用于偵聽(tīng)列表的更改事件。

EventListenerlistener=newEventListener(list);list.Add("item1");//在列表中添加項(xiàng)。觸發(fā)事件顯示"事件觸發(fā)"listener.Detach();//分離事件,之后不再處理事件.list.Add("item2");//在列表中添加項(xiàng)。不顯示"事件觸發(fā)"}}委托與事件10.NET框架事件的委托類(lèi)型.NET框架用于事件的委托類(lèi)型采用兩個(gè)參數(shù):“對(duì)象源”參數(shù)(用于指示事件源)和特定于事件的參數(shù)(它封裝有關(guān)事件的其他任何信息)。特定于事件的參數(shù)應(yīng)從EventArgs類(lèi)派生。對(duì)于不使用任何附加信息的事件,.NET框架提供了EventHandler委托類(lèi)型:publicdelegatevoidEventHandler(Objectsender, EventArgse);因此前面例子的事件委托類(lèi)型ChangedEventHandler可將其更改為EventHandler委托類(lèi)型,從而符合NET框架的事件準(zhǔn)則。委托與事件11Windows應(yīng)用程序事件處理機(jī)制

下面解釋第一章WelcomeWorld項(xiàng)目的form1.cs使用按鈕事件的處理機(jī)制:用來(lái)定義按鈕事件的委托類(lèi)型是.Net框架定義的委托:publicdelegatevoidEventHandler(Objectsender,EventArgse)Button(發(fā)送類(lèi))具有事件:

publiceventEventHandlerClick。Form1(接收類(lèi))定義創(chuàng)建一個(gè)方法btnOk_Click來(lái)接收該事件publicpartialclassForm1:Form{privatevoidbtnOk_Click(objectsender, EventArgse){MessageBox.Show("您好!"+txtUserName.Text);}}12訂閱事件:Form1向btnOk按鈕(發(fā)送類(lèi))的Click事件使用+=添加處理方法btnOk_Click的委托來(lái)訂閱事件。partialclassForm1{…privatevoidInitializeComponent(){… this.btnOk.Click+=new System.EventHandler(this.btnOk_Click); }}當(dāng)鼠標(biāo)點(diǎn)擊btnOk按鈕將觸發(fā)按鈕的Click事件,該事件將調(diào)用添加到事件委托的btnOk_Click方法,完成所需的處理工作。13泛型概述泛型是一種參數(shù)化類(lèi)型,可以實(shí)現(xiàn)在相同代碼上操作多種數(shù)據(jù)類(lèi)型。泛型編程利用“參數(shù)化類(lèi)型”將類(lèi)型抽象化,從而實(shí)現(xiàn)更為靈活的復(fù)用。類(lèi)型參數(shù)使得類(lèi)和方法將一個(gè)或多個(gè)類(lèi)型的指定推遲到聲明并實(shí)例化該類(lèi)或方法的時(shí)候。泛型賦予了代碼具有更強(qiáng)的類(lèi)型安全,更好的復(fù)用,更高的效率,更清晰的約束。下面是一個(gè)泛型類(lèi)MyStack<T>的定義,以及泛型對(duì)象的實(shí)例化。泛型14泛型概述classMyStack<T>{ privateT[]store; privateintsize; publicMyStack(){ store=newT[10]; size=0; } publicvoidPush(Tx) {store[size++]=x;} publicTPop(){ returnstore[--size]; }}classTest{ staticpublicvoidMain(){ MyStack<int>x=newMyStack<int>(); x.Push(17);} }泛型15泛型泛型概述

泛型的主要特點(diǎn):使用泛型類(lèi)型可以最大限度地重用代碼、保護(hù)類(lèi)型的安全以及提高性能。泛型最常見(jiàn)的用途是創(chuàng)建集合類(lèi)。.NET框架類(lèi)庫(kù)的System.Collections.Generic命名空間包含新的泛型集合類(lèi)如List泛型類(lèi)。應(yīng)盡可能使用泛型集合類(lèi)代替普通集合類(lèi),如使用List替代System.Collections命名空間ArrayList。可以創(chuàng)建自己的泛型接口、泛型類(lèi)、泛型方法、泛型事件和泛型委托。可以對(duì)泛型類(lèi)進(jìn)行約束以對(duì)類(lèi)型參數(shù)的類(lèi)型種類(lèi)施加限制。關(guān)于泛型數(shù)據(jù)類(lèi)型中使用的類(lèi)型的信息可在運(yùn)行時(shí)通過(guò)反射獲取。泛型16聲明泛型類(lèi)或結(jié)構(gòu) 可單獨(dú)聲明泛型類(lèi)型(包括類(lèi)與結(jié)構(gòu))。也可在基類(lèi)中包含泛型類(lèi)型的聲明。但基類(lèi)如果是泛型類(lèi),它的類(lèi)型參數(shù)要么已實(shí)例化,要么來(lái)自派生子類(lèi)(同樣是泛型類(lèi)型)聲明的類(lèi)型參數(shù)。例如:classC<U,V>{。。。}//合法classD:C<string,int>{。。。}//合法classE<U,V>:C<U,V>{。。。}//合法classF<U,V>:C<string,int>{。。}//合法classG:C<U,V>{。。}//非法泛型17泛型接口泛型接口的類(lèi)型參數(shù)要么已實(shí)例化,要么來(lái)源于實(shí)現(xiàn)類(lèi)聲明的類(lèi)型參數(shù)。interfaceIDictionary<K,V>{

voidAdd(Kkey,Vvalue);}

classList<T>:IList<T>,IDictionary<int,T>{

publicvoidAdd(intindex,Tvalue){}}泛型18泛型類(lèi)型的數(shù)據(jù)成員泛型類(lèi)型的數(shù)據(jù)成員,可以使用泛型類(lèi)型聲明中的類(lèi)型參數(shù)定義泛型類(lèi)型的成員。classC<V>{

publicVf1;//聲明字段

publicD<V>f2;//作為其他泛型類(lèi)型

的參數(shù)

publicC<Vx>

{this.f1=x;

}

}泛型19泛型方法 泛型方法,泛型方法是使用類(lèi)型參數(shù)聲明的方法,如下所示:staticvoidSwap<T>(refTlhs,refTrhs){Ttemp;temp=lhs;lhs=rhs;rhs=temp;}

下面的代碼示例演示一種使用int作為類(lèi)型參數(shù)調(diào)用Swap泛型方法:publicstaticvoidTestSwap(){ inta=1;intb=2; Swap<int>(refa,refb);//也可以省略類(lèi)型參數(shù)Swap(refa,refb);}泛型20類(lèi)型參數(shù)的約束 在定義泛型類(lèi)時(shí),可以對(duì)類(lèi)型參數(shù)的類(lèi)型種類(lèi)施加限制。如果嘗試使用某個(gè)約束所不允許的類(lèi)型來(lái)實(shí)例化類(lèi),則會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤。這些限制稱(chēng)為約束。約束是使用where關(guān)鍵字指定的。 約束可以指定"基類(lèi)約束","接口約束","構(gòu)造器約束","值類(lèi)型/引用類(lèi)型約束"共四中約束.基類(lèi)約束:

參數(shù)類(lèi)型必須是基類(lèi)或其派生類(lèi),如下面whereS:A。classA{publicvoidF1(){}}classB{publicvoidF2(){}}classC<S,T> whereS:A//S繼承自A//可以在類(lèi)型為S變量調(diào)用F1 whereT:B//{T繼承自B//可以在類(lèi)型為T(mén)變量調(diào)用F2}泛型21接口約束接口約束,類(lèi)型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定接口的類(lèi)型。可以指定多個(gè)接口約束。約束接口也可以是泛型的。interfaceIPrintable{voidPrint();}interfaceIComparable<T>{intCompareTo(Tv);}interfaceIKeyProvider<T>{THetKey();}classDictionary<K,V>whereK:IComparable<K>whereV:IPrintable,IKeyProvider<K>{//可以在類(lèi)型為K的變量上調(diào)用CompareTo//可以在類(lèi)型為V的變量上調(diào)用Print和GetKey}泛型22值類(lèi)型/引用類(lèi)型約束

值類(lèi)型約束whereT:struct中類(lèi)型參數(shù)必須是值類(lèi)型。可以指定除Nullable以外的任何值類(lèi)型。引用類(lèi)型約束whereT:class中類(lèi)型參數(shù)必須是引用類(lèi)型,包括任何類(lèi)、接口、委托或數(shù)組類(lèi)型。泛型23值類(lèi)型/引用類(lèi)型約束publicstructA{}publicclassB{}classC<T>whereT:struct{/*T在這里面是一個(gè)值類(lèi)型*/ }classD<T>whereT:class{/*T在這里面是一個(gè)引用類(lèi)型*/}classtest{ staticpublicvoidMain() { C<A>ca=newC<A>();//可以,A是值類(lèi)型

//C<B>cb=newC<B>();//錯(cuò)誤,B是引用類(lèi)型

//D<A>da=newD<A>();//錯(cuò)誤,A是值類(lèi)型

D<B>db=newD<B>();//可以,B是引用類(lèi)型

}}泛型24可空類(lèi)型概述可空類(lèi)型是Nullable泛型結(jié)構(gòu)的實(shí)例。Nullable泛型結(jié)構(gòu)的定義如下:

publicstructSystem.Nullable<T>whereT:struct這里T表示可空類(lèi)型的基礎(chǔ)值類(lèi)型,可空類(lèi)型可以表示其基礎(chǔ)值類(lèi)型正常范圍內(nèi)的值,再加上一個(gè)null值。例如Nullable<int>,簡(jiǎn)寫(xiě)int?,讀作“可空的int”,可以被賦值為-2147483648到2147483647之間的任意值,也可以被賦值為null值。Nullable<bool>可以被賦值為true或false,或null。可空類(lèi)型25可空類(lèi)型概述可空類(lèi)型具有以下特性:可空類(lèi)型表示可被賦值為null值的值類(lèi)型變量。無(wú)法創(chuàng)建基于引用類(lèi)型的可空類(lèi)型。(引用類(lèi)型已支持null值。)。語(yǔ)法T?是System.Nullable<T>的簡(jiǎn)寫(xiě),此處的T為值類(lèi)型。這兩種形式可以互換。如果基礎(chǔ)類(lèi)型的值為null,請(qǐng)使用System.Nullable.GetValueOrDefault屬性返回該基礎(chǔ)類(lèi)型所賦的值或默認(rèn)值。請(qǐng)使用HasValue和Value只讀屬性測(cè)試是否為空和檢索值,例如if(x.HasValue)j=x.Value;可空類(lèi)型變量的默認(rèn)值將HasValue設(shè)置為false。未定義Value。使用??運(yùn)算符分配默認(rèn)值,當(dāng)前值為空的可空類(lèi)型被賦值給非空類(lèi)型時(shí)將應(yīng)用該默認(rèn)值,如int?x=null;inty=x??-1;y的值最后為-1。可空類(lèi)型26使用可空類(lèi)型可空類(lèi)型的成員,可空類(lèi)型的每個(gè)實(shí)例都具有兩個(gè)公共的只讀屬性:HasValue和Value。int?x=10;if(x.HasValue)//或(x!=null) System.Console.WriteLine(x.Value);else System.Console.WriteLine("Undefined");可空類(lèi)型轉(zhuǎn)換,可空類(lèi)型可強(qiáng)制轉(zhuǎn)換為常規(guī)類(lèi)型,如果可空類(lèi)型變量值為空,強(qiáng)制轉(zhuǎn)換引發(fā)異常。從普通類(lèi)型到可空類(lèi)型的轉(zhuǎn)換是隱式的。int?n=null;intm2=(int)n;//如果此變量的值為空,引發(fā)異常intm3=n.Value;//如果此變量的值為空,引發(fā)異常n=10;//轉(zhuǎn)換是隱式的可空類(lèi)型27使用可空類(lèi)型可空類(lèi)型運(yùn)算 可空類(lèi)型還可以使用預(yù)定義的一元和二元運(yùn)算符,以及用戶(hù)定義的值類(lèi)型運(yùn)算符。如果操作數(shù)為空,這些運(yùn)算符將產(chǎn)生一個(gè)空值;否則操作數(shù)將使用包含的值來(lái)計(jì)算結(jié)果。例如:int?a=10;int?b=null;a++;//a=11.a=a*10;//a=110.a=a+b;//a=null.可空類(lèi)型28使用可空類(lèi)型可空類(lèi)型比較 在執(zhí)行可空類(lèi)型的比較時(shí),如果其中任一可空類(lèi)型為null,則比較結(jié)果將始終為false。因此,一定不要以為由于一個(gè)比較結(jié)果為false,相反的情況就會(huì)為true。例如:int?num1=10;int?num2=null;if(num1>=num2)//比較結(jié)果將始終為false??運(yùn)算符??運(yùn)算符定義在將可空類(lèi)型分配給非可空類(lèi)型時(shí)返回的默認(rèn)值,c??-1等效于(c!=null?c:-1)。int?c=null;intd=c??-1;//d=-1.c=2;d=c??-1;//d=2可空類(lèi)型29反射概述反射(Reflection)是.NET的重要機(jī)制,通過(guò)反射,可以在運(yùn)行時(shí)獲得.NET中每一個(gè)類(lèi)型(包括類(lèi)、結(jié)構(gòu)、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構(gòu)造函數(shù)等。還可以獲得每個(gè)成員的名稱(chēng)、限定符和參數(shù)等。如果獲得了構(gòu)造函數(shù)的信息,即可直接創(chuàng)建對(duì)象,反射30.NET可執(zhí)行應(yīng)用程序結(jié)構(gòu)程序代碼在編譯后生成可執(zhí)行的應(yīng)用程序。應(yīng)用程序結(jié)構(gòu)分為應(yīng)用程序域—程序集—模塊—類(lèi)型—成員幾個(gè)層次,公共語(yǔ)言運(yùn)行庫(kù)加載器管理應(yīng)用程序域,這種管理包括將每個(gè)程序集加載到相應(yīng)的應(yīng)用程序域以及控制每個(gè)程序集中類(lèi)型層次結(jié)構(gòu)的內(nè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)型的方法或訪問(wèn)其字段和屬性。反射31反射獲取和加載程序集System.Reflection.Assembly

使用反射來(lái)獲取程序集常用的有以下幾種方法:獲取AppDomain中包含的所有程序集調(diào)用AppDomain類(lèi)的屬性currentDomain(當(dāng)前應(yīng)用程序域)的GetAssemblies方法將返回一個(gè)由System.Reflection.Assembly(程序集)元素組成的數(shù)組,示例如下:

foreach(AssemblyasseminAppdomain.currentDomain.GetAssemblies()){…}加載單個(gè)程序集,System.Reflecton.Assembly類(lèi)型為加載一個(gè)程序集,提供了以下方法(推薦Load方法):Load方法:例如:AssemblyaAssembly=System.Reflecton.Assembly.Load("PetShop.SQLServerDAL");LoadFrom方法:例如:Assemblya=System.Reflecton.Assembly.LoadFrom( "ReflectSample.exe");反射32反射獲取類(lèi)型System.Type使用反射來(lái)獲取類(lèi)型常用的有以下幾種方法:使用typeof運(yùn)算符獲取類(lèi)型的System.Type對(duì)象,如:System.Typetype=typeof(int);System.Typetype=typeof(HelloWorld);//HelloWorld是自定義的類(lèi)名通過(guò)類(lèi)型實(shí)例,使用方法GetType獲取類(lèi)型的System.Type對(duì)象,如:intintA=10;System.Typetype=intA.GetType();獲取程序集所包含的所有類(lèi)型 使用程序集實(shí)例的GetTypes方法可以獲取程序集所包含的所有類(lèi)型,如:Assemblya=Assembly.LoadFrom("ReflectSample.exe");Type[]mytypes=a.GetTypes();//從程序集獲取所有數(shù)據(jù)類(lèi)型反射33反射創(chuàng)建類(lèi)型的成員以下介紹幾個(gè)用于類(lèi)型成員的類(lèi):ConstructorInfo類(lèi)用于類(lèi)型的構(gòu)造函數(shù),使用ConstructorInfo可以獲取以下信息:構(gòu)造函數(shù)的名稱(chēng)、參數(shù)、訪問(wèn)修飾符(如public或private)和實(shí)現(xiàn)詳細(xì)信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法來(lái)創(chuàng)建特定的構(gòu)造函數(shù)ConstructorInfo對(duì)象。

ConstructorInfo[]p=typeof(t).GetConstructors();for(inti=0;i<p.Length;i++){Console.WriteLine(p[i].IsStatic);}

MethodInfo類(lèi)用于類(lèi)型的方法成員,使用MethodInfo獲取以下信息:方法的名稱(chēng)、返回類(lèi)型、參數(shù)、訪問(wèn)修飾符(如public或private)和實(shí)現(xiàn)詳細(xì)信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法來(lái)獲取MethodInfo對(duì)象。反射34反射創(chuàng)建類(lèi)型的成員使用FieldInfo獲取以下信息:字段的名稱(chēng)、訪問(wèn)修飾符(如public或private)和實(shí)現(xiàn)詳細(xì)信息(如static)等;并獲取或設(shè)置字段值。使用Type的GetField等方法來(lái)獲取FieldInfo對(duì)象。使用EventInfo獲取以下信息:事件的名稱(chēng)、事件處理程序數(shù)據(jù)類(lèi)型、自定義屬性、聲明類(lèi)型和反射類(lèi)型等;并添加或移除事件處理程序。使用Type的GetEvent等方法來(lái)獲取EventInfo對(duì)象。使用PropertyInfo獲取以下信息:屬性的名稱(chēng)、數(shù)據(jù)類(lèi)型、聲明類(lèi)型、反射類(lèi)型和只讀或可寫(xiě)狀態(tài)等;并獲取或設(shè)置屬性值。使用Type的GetProperty等方法來(lái)獲取PropertyInfo對(duì)象。反射35反射創(chuàng)建類(lèi)型的實(shí)例通過(guò)反射創(chuàng)建類(lèi)型的實(shí)例常用的有以下幾種方法:使用System.Activator的CreateInstance方法創(chuàng)建類(lèi)型的實(shí)例。例如:

Objectobj=Activator.CreateInstance(type);//type是一個(gè)類(lèi)型對(duì)象Assembly對(duì)象的CreateInstance實(shí)例方法,如:

PetShop.IDAL.IproductmyProduct=(PetShop.IDAL.IProduct) aAssembly.CreateInstance("PetShop.SQLServerDAL.Product");可以將反射程序集與創(chuàng)建類(lèi)型的實(shí)例合并如下,這是常用的方法,代碼如下:

PetShop.IDAL.IproductmyProduct=(PetShop.IDAL.IProduct)Assembly.Load(

"PetShop.SQLServerDAL").CreateInstance("PetShop.SQLServerDAL.Product");反射36反射調(diào)用類(lèi)型實(shí)例的方法使用反射調(diào)用類(lèi)型實(shí)例的方法有以下幾種方式:使用System.type的對(duì)象t調(diào)用InvokeMember方法來(lái)調(diào)用一個(gè)類(lèi)型的實(shí)例方法。如:

Strings=(String)t.InvokeMember("ToString", BindingFlags.DeclaredOnly|BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.InvokeMethod,null,obj,null);使用System.reflection.MethodInfo的Invoke方法來(lái)調(diào)用一個(gè)類(lèi)型的實(shí)例方法。如:MethodInfomsayhello=ht.GetMethod("SayHello");//獲取SayHello方法msayhello.Invoke(obj,null);//調(diào)用HelloWorld實(shí)例obj的SayHello方法反射37反射技術(shù)示例新建一個(gè)C#控制臺(tái)應(yīng)用程序項(xiàng)目,給項(xiàng)目命名為ReflectSample。在該項(xiàng)目中添加新類(lèi)HelloWorld.cs,代碼如下:namespaceReflectSample{publicclassHelloWorld{privatestringstrName=null;publicHelloWorld(stringname) {strName=name;}publicHelloWorld(){}publicstringName{get{returnstrName;}}publicvoidSayHello(){if(strName==null) Console.WriteLine("HelloWorld");elseConsole.WriteLine("Hello"+strName);}}}反射38修改Program.cs代碼如下:usingSystem.Reflection;namespaceReflectSampl

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論