動(dòng)態(tài)代理DynamicProxy 介紹_.Net教程
推薦: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 |
然后優(yōu)雅地這樣調(diào)用:
以下為引用的內(nèi)容: foreach (Control control in this.groupBox1.Controls) |
你可以繼續(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è)就是大家使用的
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- ASP.NET的實(shí)時(shí)天氣及24小時(shí)天氣預(yù)報(bào)
- 解讀軟件編程的走火入魔
- 淺析C#編程實(shí)現(xiàn)動(dòng)態(tài)生成Word文檔
- Asp.Net2.0技巧(續(xù))
- ASP.NET備份恢復(fù)SqlServer數(shù)據(jù)庫
- 在網(wǎng)頁中動(dòng)態(tài)的生成一個(gè)圖片
- 關(guān)于IronPython和C#執(zhí)行速度對(duì)比
- ASP.NET中數(shù)據(jù)庫的操作初步----增加、刪除、修改
- 淺談ASP.NET中如何使用AJAX中的方式
- 編寫ASP.NET應(yīng)用程序的技巧
- 相關(guān)鏈接:
- 教程說明:
.Net教程-動(dòng)態(tài)代理DynamicProxy 介紹。