動(dòng)態(tài)代理DynamicProxy 介紹_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:asp.net ajax 使用updatepanel進(jìn)行更新后的提示
      想實(shí)現(xiàn)這樣一個(gè)簡(jiǎn)單的功能,卻折騰了半天。原因是第一次使用asp.net Ajax,本來是不想使用的MS的。卻想看看他的框架如何。 使用Response.write (js) 會(huì)出錯(cuò)。找了一些文檔來看,原來要使用S

      我們使用動(dòng)態(tài)代理,主要是因?yàn)閯?dòng)態(tài)代理擁有這樣的能力--使得某個(gè)類型A在運(yùn)行的時(shí)候能轉(zhuǎn)化為一個(gè)指定的接口I,即使這個(gè)類型A在定義的時(shí)候并沒有從這個(gè)指定的接口I繼承。這句話是什么意思了?還是回到當(dāng)泛型的參數(shù)類型是動(dòng)態(tài)的... 一文中的那個(gè)例子,在例子中,List<>并沒有從ISimpleList繼承,但是從表面看來,在運(yùn)行的時(shí)候,我們通過動(dòng)態(tài)代理可以以ISimpleList接口來“引用”List<>類型的對(duì)象。

      動(dòng)態(tài)代理是在運(yùn)行時(shí)在內(nèi)存中構(gòu)建的一種類型,該類型實(shí)現(xiàn)了接口I,但是它將所有的方法調(diào)用都轉(zhuǎn)發(fā)給類型A。

      注意,上面我使用了“方法”調(diào)用的轉(zhuǎn)發(fā),由于,事件、屬性都是方法的變體,所以,對(duì)接口中定義的所有元素的Call都可以被動(dòng)態(tài)代理轉(zhuǎn)發(fā)。那么,接口(I)中的方法與被代理者(Target)的方法如何匹配起來了?通常的方法是,進(jìn)行“同名”匹配,比如ISimpleList接口的Add方法就自然匹配到List<>的Add方法。對(duì)于復(fù)雜的需求,可以定義一個(gè)方法名映射表來匹配不同名的方法。

      由于,動(dòng)態(tài)代理擁有這種為類型(Target)“換臉”的能力,所以,在很多場(chǎng)合可以使用它來優(yōu)雅地解決一些以前難以處理的問題(通常,以前我們使用反射來解決這些麻煩),比如:

      (1)“泛型參數(shù)類型是動(dòng)態(tài)的”,使用動(dòng)態(tài)代理解決這種問題不僅可以避免反射帶來的性能損失,而且還可以獲得強(qiáng)類型方法調(diào)用的好處。

      (2)為一組類型“變臉”。比如,TextBox、RichTextBox、ListView等windows控件都有Clear方法,但是它們都沒有實(shí)現(xiàn)一個(gè)統(tǒng)一的接口(比如,該接口中定義了Clear方法),所以當(dāng)我要清空某個(gè)GroupBox中所有控件的內(nèi)容時(shí),無法用一種統(tǒng)一的方式調(diào)用,你不能這樣做:

      以下為引用的內(nèi)容:
      foreach (Control control in this.groupBox1.Controls)
      {
      control.Clear(); //Control不存在Clear方法,編譯報(bào)錯(cuò)
      }

      但是有了動(dòng)態(tài)代理之后,我們就可以為這些控件定義一個(gè)New Face:

      以下為引用的內(nèi)容:

      public interface INewFace
      {
      void Clear();
      }

      然后優(yōu)雅地這樣調(diào)用:

      以下為引用的內(nèi)容:

      foreach (Control control in this.groupBox1.Controls)
      {
      INewFace face = DynamicTypeEmitter.CreateDynamicProxy<INewFace>(control);
      face.Clear();
      }

      你可以繼續(xù)挖掘使用動(dòng)態(tài)代理的其它場(chǎng)合,發(fā)揮你的想象力,來展現(xiàn)動(dòng)態(tài)代理的威力。

      關(guān)于ESBasic中的 DynamicTypeEmitter 實(shí)現(xiàn),有一點(diǎn)缺憾,那就是暫時(shí)還不支持“泛型方法”的調(diào)用轉(zhuǎn)發(fā),我還不知道如何使用Emit發(fā)射對(duì)動(dòng)態(tài)類型參數(shù)的泛型方法的調(diào)用,有知道的朋友請(qǐng)指導(dǎo)下。

      分享:Asp.net 2.0 ViewState原理
      ViewState相信大家都會(huì)使用,可ViewState到底是什么,又有多少人知道呢? StateBag類這個(gè)就不用多說啦吧 在Asp.net 2.0 里,用到StateBag有三處 1 Control._viewState 這個(gè)就是大家使用的

      來源:模板無憂//所屬分類:.Net教程/更新時(shí)間:2008-08-22
      相關(guān).Net教程