static void EmitMethods(Type interf, TypeBuilder proxyTypeBuilder, FieldInfo realTarget) { MethodInfo[] methods = interf.GetMethods(); foreach (MethodInfo mi in methods) { Type[] argsTypes = getTypesOf(mi.GetParameters()); MethodBuilder methodBuilder = proxyTypeBuilder.DefineMethod(mi.Name, MethodAttributes.Public | MethodAttributes.Virtual, mi.ReturnType, argsTypes); MethodInfo realMethod = realTarget.FieldType.GetMethod(mi.Name, argsTypes); ILGenerator generator = methodBuilder.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldfld, realTarget); for (int i = 0; i < argsTypes.Length; i++) generator.Emit(OpCodes.Ldarg, i+1); OpCode callCode = OpCodes.Call; if (realMethod.IsVirtual) callCode = OpCodes.Callvirt; generator.EmitCall(callCode, realMethod, null); generator.Emit(OpCodes.Ret); } } Fuente 1. Generación de cada uno de los métodos del tipo proxy creado por el conversor |