動態(tài)代理DynamicProxy 介紹_.Net教程
推薦:asp.net ajax 使用updatepanel進行更新后的提示想實現這樣一個簡單的功能,卻折騰了半天。原因是第一次使用asp.net Ajax,本來是不想使用的MS的。卻想看看他的框架如何。 使用Response.write (js) 會出錯。找了一些文檔來看,原來要使用S
我們使用動態(tài)代理,主要是因為動態(tài)代理擁有這樣的能力--使得某個類型A在運行的時候能轉化為一個指定的接口I,即使這個類型A在定義的時候并沒有從這個指定的接口I繼承。這句話是什么意思了?還是回到當泛型的參數類型是動態(tài)的... 一文中的那個例子,在例子中,List<>并沒有從ISimpleList繼承,但是從表面看來,在運行的時候,我們通過動態(tài)代理可以以ISimpleList接口來“引用”List<>類型的對象。
動態(tài)代理是在運行時在內存中構建的一種類型,該類型實現了接口I,但是它將所有的方法調用都轉發(fā)給類型A。

注意,上面我使用了“方法”調用的轉發(fā),由于,事件、屬性都是方法的變體,所以,對接口中定義的所有元素的Call都可以被動態(tài)代理轉發(fā)。那么,接口(I)中的方法與被代理者(Target)的方法如何匹配起來了?通常的方法是,進行“同名”匹配,比如ISimpleList接口的Add方法就自然匹配到List<>的Add方法。對于復雜的需求,可以定義一個方法名映射表來匹配不同名的方法。
由于,動態(tài)代理擁有這種為類型(Target)“換臉”的能力,所以,在很多場合可以使用它來優(yōu)雅地解決一些以前難以處理的問題(通常,以前我們使用反射來解決這些麻煩),比如:
(1)“泛型參數類型是動態(tài)的”,使用動態(tài)代理解決這種問題不僅可以避免反射帶來的性能損失,而且還可以獲得強類型方法調用的好處。
(2)為一組類型“變臉”。比如,TextBox、RichTextBox、ListView等windows控件都有Clear方法,但是它們都沒有實現一個統(tǒng)一的接口(比如,該接口中定義了Clear方法),所以當我要清空某個GroupBox中所有控件的內容時,無法用一種統(tǒng)一的方式調用,你不能這樣做:
| 以下為引用的內容: foreach (Control control in this.groupBox1.Controls) { control.Clear(); //Control不存在Clear方法,編譯報錯 } |
但是有了動態(tài)代理之后,我們就可以為這些控件定義一個New Face:
| 以下為引用的內容: public interface INewFace |
然后優(yōu)雅地這樣調用:
| 以下為引用的內容: foreach (Control control in this.groupBox1.Controls) |
你可以繼續(xù)挖掘使用動態(tài)代理的其它場合,發(fā)揮你的想象力,來展現動態(tài)代理的威力。
關于ESBasic中的 DynamicTypeEmitter 實現,有一點缺憾,那就是暫時還不支持“泛型方法”的調用轉發(fā),我還不知道如何使用Emit發(fā)射對動態(tài)類型參數的泛型方法的調用,有知道的朋友請指導下。
分享:Asp.net 2.0 ViewState原理ViewState相信大家都會使用,可ViewState到底是什么,又有多少人知道呢? StateBag類這個就不用多說啦吧 在Asp.net 2.0 里,用到StateBag有三處 1 Control._viewState 這個就是大家使用的
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-動態(tài)代理DynamicProxy 介紹
。