日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

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

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

推薦: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
{
void Clear();
}

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

以下為引用的內容:

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

你可以繼續(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 這個就是大家使用的

來源:模板無憂//所屬分類:.Net教程/更新時間:2008-08-22
相關.Net教程