Exemplo n.º 1
0
        private static Type EmitProxyType(Type baseType, Type interfaceType)
        {
            AssemblyBuilder asmBuilder = ProxyUtils.GetAssemblyBuilder("DynamicProxyAssembly");
            ModuleBuilder   mBuilder   = ProxyUtils.GetModule(asmBuilder, "EmittedProxies");
            TypeBuilder     tBuilder   = ProxyUtils.GetType(mBuilder, String.Format("{0}{1}Proxy", baseType.FullName, interfaceType), baseType, new[] { interfaceType });

            // Emit parametrized ctor
            var constructors = baseType.GetConstructors();

            foreach (var ctor in constructors)
            {
                Debug.WriteLine(ctor.Name);
                EmitCtor(tBuilder, ctor);
            }

            // Get namespace information
            var namespaceAttr = ProxyUtils.GetCustomAttribute <ProxyNamespaceAttribute>(interfaceType);
            var ns            = namespaceAttr == null ? "" : namespaceAttr.Namespace;

            // Create methods in interfaceType
            var superType     = typeof(ProxyBase);
            var invokeMethod  = superType.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.NonPublic);
            var convertMethod = superType.GetMethod("ConvertReturnValue", BindingFlags.Instance | BindingFlags.NonPublic);
            var methods       = interfaceType.GetMethods();

            foreach (var method in methods)
            {
                Debug.WriteLine(method.Name);
                EmitInterfaceMethod(tBuilder, ns, method, invokeMethod, convertMethod);
            }
            var proxyType = tBuilder.CreateType();

            return(proxyType);
        }