hBifTs

山自高兮水自深!當塵霧消散,唯事實留傳.荣辱不惊, 看庭前花开花落; 去留随意, 望天上云展云舒.

导航

修改过的DynamicProxy....

Posted on 2004-04-12 12:47  hbiftsaa  阅读(2182)  评论(8编辑  收藏  举报

我在前面的文章说了DynamicProxy.NET的用法..
提到了一个比较不爽的问题,就是你使用它,你自己的对象一定得从一个interface继承..
即,你使用它的时候也得通过这个interface来使用它...

现在我把它修改了一下,使得它可以直接从一个类继承,不需要interface了..

TypeBuilder typeBuilder = moduleBuilder.DefineType(
                    dynamicTypeName, typeAttributes, objType, interfaces );
原来的代码是这样子的.注意他的第三个参数.objType
这个变量的定义如下:
 Type objType = typeof( System.Object );
这里,问题出来了,因为它给动态生成的类的基类为Object,所以我们就不能把它转成我们自己的类型...
好,我们修改一下,把我们自己的类的Type传进来.
private Type CreateType( IProxyInvocationHandler handler,Type objType, Type[] interfaces,  object[] nparam, string dynamicTypeName )
修改函数定义,这里面的objType就是我们自己的类的Type了...

然后,修改生成的函数的部分
foreach(Type interfaceType in interfaces){
         GenerateMethod( interface, handlerField, typeBuilder );
}
这里,它是得到类的接口,再一个个的实现接口的函数.
我们这里不要接口了.直接从类得到它所有的函数
改成:
GenerateMethod( objType, handlerField, typeBuilder );
这样子,在
       private void GenerateMethod( Type interfaceType, FieldBuilder handlerField, TypeBuilder typeBuilder ) {
  
            MethodInfo[] interfaceMethods = interfaceType.GetMethods();
            if ( interfaceMethods != null ) {

                for ( int i = 0; i < interfaceMethods.Length; i++ ) {
                    MethodInfo methodInfo = interfaceMethods[i];

     MetaDataFactory.Add(methodInfo);
里面,我们就可以得到类的所有的函数(public)了.

好,这样子修改后,我们的DynamicProxy就可以直接使用一个类了,不管它有没有从接口继承...
呵呵..


btw,我现在已把DynamicProxy大量修改了,它现在可以Hook构造函数,所有的public virtual(一定得是virtual)函数.
可以完成steeven在这个文章轻便事务的思考里面的功能了:P
等全搞定了我再写一个文章出来吧,重点是Emit的使用..