我在前面的文章说了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的使用..