当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 动态代理DynamicProxy 介绍

ASP.NET
.Net中使用com组件后发生System.ArithmeticException异常的解决办法
SQL Server.net 和 OLE DB.net连接数据库的比较
后台更新DataTable行内容的方法
敏捷软件开发(原则,模式与实践)笔记1
确保文本框输入值为数值的代码
XML和数据库之间相互的映射
让你的.NET程序兼容不同版本的Dll文件。
.NET 的数据访问应用程序块(Data Access Application Block)
用控件仅一条指令实现界面换肤和多语言版本(YFSkins)
Microsoft User Interface Process Application Block 研究(3)
分享:处理Excel方法小结
基于ASP.NET实现全球化
.net 里面 protected private 的变量也可以访问(新发现)。
关于C#中{0}和{1}的问题初次在此发贴,问题对你易对我难,求救了
使用C#代码实现增加用户帐号
全世界都在关注-微软重大产品发布
教你做Rational Rose(UML Design)
OLE DB取得数据库的架构信息
VB 从零开始编外挂(三)
XPath序列之四

ASP.NET 中的 动态代理DynamicProxy 介绍


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 77 ::
收藏到网摘: n/a

我们使用动态代理,主要是因为动态代理拥有这样的能力--使得某个类型A在运行的时候能转化为一个指定的接口I,即使这个类型A在定义的时候并没有从这个指定的接口I继承。这句话是什么意思了?还是回到当泛型的参数类型是动态的... 一文中的那个例子,在例子中,List<>并没有从ISimpleList继承,但是从表面看来,在运行的时候,我们通过动态代理可以以ISimpleList接口来“引用”List<>类型的对象。

动态代理是在运行时在内存中构建的一种类型,该类型实现了接口I,但是它将所有的方法调用都转发给类型A。

注意,上面我使用了“方法”调用的转发,由于,事件、属性都是方法的变体,所以,对接口中定义的所有元素的Call都可以被动态代理转发。那么,接口(I)中的方法与被代理者(Target)的方法如何匹配起来了?通常的方法是,进行“同名”匹配,比如ISimpleList接口的Add方法就自然匹配到List<>的Add方法。对于复杂的需求,可以定义一个方法名映射表来匹配不同名的方法。

由于,动态代理拥有这种为类型(Target)“换脸”的能力,所以,在很多场合可以使用它来优雅地解决一些以前难以处理的问题(通常,以前我们使用反射来解决这些麻烦),比如:

(1)“泛型参数类型是动态的”,使用动态代理解决这种问题不仅可以避免反射带来的性能损失,而且还可以获得强类型方法调用的好处。

(2)为一组类型“变脸”。比如,TextBox、RichTextBox、ListView等windows控件都有Clear方法,但是它们都没有实现一个统一的接口(比如,该接口中定义了Clear方法),所以当我要清空某个GroupBox中所有控件的内容时,无法用一种统一的方式调用,你不能这样做:

以下为引用的内容:
  foreach (Control control in this.groupBox1.Controls)
            {
                control.Clear(); //Control不存在Clear方法,编译报错
            }

但是有了动态代理之后,我们就可以为这些控件定义一个New Face:

以下为引用的内容:

public interface INewFace
    {
        void Clear();
    }

然后优雅地这样调用:

以下为引用的内容:

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

你可以继续挖掘使用动态代理的其它场合,发挥你的想象力,来展现动态代理的威力。

关于ESBasic中的 DynamicTypeEmitter 实现,有一点缺憾,那就是暂时还不支持“泛型方法”的调用转发,我还不知道如何使用Emit发射对动态类型参数的泛型方法的调用,有知道的朋友请指导下。