实现.net下的动态代理new

上传人:xins****2008 文档编号:111251724 上传时间:2019-11-02 格式:DOC 页数:15 大小:475KB
返回 下载 相关 举报
实现.net下的动态代理new_第1页
第1页 / 共15页
实现.net下的动态代理new_第2页
第2页 / 共15页
实现.net下的动态代理new_第3页
第3页 / 共15页
实现.net下的动态代理new_第4页
第4页 / 共15页
实现.net下的动态代理new_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《实现.net下的动态代理new》由会员分享,可在线阅读,更多相关《实现.net下的动态代理new(15页珍藏版)》请在金锄头文库上搜索。

1、一、动态代理可以解决哪些问题本文描述的动态代理可以解决以下问题:问题1:接口约束问题场景A:ComboBox类与ToolStripComboBox类的行为大部分相似,它们却不共享某个粒度较大的接口,以至于对这两个类的操作代码难以公用。场景B:在泛型程序中,我们必需为泛型类型声明一个接口约束,才能使用该类型所对应接口约束的方法与属性。这样以来有一个问题:存在接口A,类型B,A中的所有属性和方法签名B都有,但B不是A的实现,不能由B转换为A。而由于某些原因,我们无法获得B的代码或者虽然能够获得B的代码,却由于种种考虑不能更改B的代码;大多数情况下,可以新写一个类C,使类C继承自B,再让C实现接口A

2、。然而,其一,代码量较大;其二,当B为Sealed时不能继承;其三:不方便使用继承(如:继承后,IDE中的设计器无法给新类提供支持)。此时,我们希望动态代理能解决这个问题:假定我们有一个接口:1publicinterfaceTInterface23StringAget;4StringB(Objecta,Objectb,Objectc,Objectd,Objecte);56有一个类:1publicclassClassA23publicStringA45get67returnString.Empty;891011publicStringB(Objecta,Objectb,Objectc,Objec

3、td,Objecte)1213returnString.Empty;14151617我们需要这个动态代理类(假定为 TypeTemplate)提供一个方法,能够方便的生成一个代理类实例,将ClassA的实例包装一下,转变为 TInterface 的实例:1publicstaticTInterfaceCreate(TImpleinstance)2whereTInterface:class3whereTImple:class4567该方法生成一个实现TInterface的动态类的实例。对于TInterface中的每一个属性或方法,该实例直接调用instance实例中具有同样签名的属性或方法,如果没

4、有匹配的属性或方法,则抛出NotImplementedException异常。问题2:快速生成现有实例类的Wrapper 场景C:假定接口TInterface有10个方法,类TImple中有9个方法与TInterface对应,为了实现TInterface,需要新写一个Wrapper类。最方便的写法是令Wrapper继承自TImple且实现接口TInterface,Wrapper只需新添实现那个未实现的方法即可。然而,如前面所述,很多情况下使用继承不是最佳选择。不用继承的话,则需要Wrapper类实现TInterface的全部10个方法,枯燥又乏味。此时,我们期待存在这样一种动态代理:它能够将几

5、个实例B,C,D一起打包,使它适合接口A。这样一来,针对场景C,我们只需要写一个简单的Wrapper类,实现那个未实现的方法,然后与TImple实例一起由动态代理工厂打包生成一个新的代理类实例即可。即:我们需要动态代理工厂TypeTemplate能够提供以下方法:1publicstaticTInterfaceCreate(TInterfaceinstance,paramsObjectimpleInstances)2whereTInterface:class3456该方法生成一个实现TInterface的类实例。对于TInterface中的每一个属性或方法,该实例依次从impleInstance

6、s中寻找具有同样签名的属性或方法,如果没有匹配的属性或方法,则抛出NotImplementedException异常。问题3:AOP应用场景D:当需要对方法进行拦截时我们需要动态代理。AOP是动态代理最经典的应用,无需赘述。这种情况下,我们需要 TypeTemplate 类提供以下的方法向代理类中加入钩子:1publicdelegatevoidHandler(TImpleimple)whereTImple:class;23publicstaticTInterfaceCreateIntercepted(TImpleinstance,Handlerbefore,Handlerafter)4wher

7、eTInterface:class5whereTImple:class6789二、实现下面来实现动态代理类工厂TypeTemplate。由于时间有限,只实现 static TInterface Create(TImple instance) 方法原型。其它几个静态方法可以用类似的方式实现。实现思路:对于问题1中的接口TInterface和类ClassA,通过Emit生成如下类型InterfaceImple_ClassA的IL代码。1publicclassInterfaceImple_ClassA:TInterface23privateClassA_wrappedInstance;45publi

8、cInterfaceImple_ClassA(ClassAinstance)67_wrappedInstance=instance;8910publicStringA1112getreturn_wrappedInstance.A;13setthrownewNotImplementedException();141516publicStringB(Objecta,Objectb,Objectc,Objectd,Objecte)1718return_wrappedInstance.B(a,b,c,d,e);19202122假定生成上面这个类型的方法为:1publicstaticTypeDynami

9、cTypeGen()2whereTInterface:classwhereTImple:class34则可用Activator轻松生成动态代理类实例:1publicstaticTInterfaceCreate(TImpleinstance)2whereTInterface:class3whereTImple:class45Typetype=DynamicTypeGen();6returnActivator.CreateInstance(type,instance)asTInterface;78下面是具体代码:Code1usingSystem;2usingSystem.Collections.G

10、eneric;3usingSystem.Text;4usingSystem.Reflection;5usingSystem.Reflection.Emit;67namespaceOrc.Generics89publicsealedclassTypeTemplate1011publicdelegatevoidHandler(TImpleimple)whereTImple:class;1213publicstaticTInterfaceCreate(TImpleinstance)14whereTInterface:class15whereTImple:class1617Typetype=Dynam

11、icTypeGen();18returnActivator.CreateInstance(type,instance)asTInterface;192021publicstaticTInterfaceCreate(TInterfaceinstance,paramsObjectimpleInstances)22whereTInterface:class2324thrownewNotImplementedException();252627publicstaticTInterfaceCreateIntercepted(TImpleinstance,Handlerbefore,Handlerafter)28whereTInterface:class29whereTImple

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号