private Type BuildProxyActivatorType( CodeBuilderContext context, Type proxyInterfaceType, Type proxyType) { var classBuilder = CodeBuilderUtils.CreateClassBuilder( context.ModuleBuilder, ns: context.AssemblyNamespace, className: this.CodeBuilder.Names.GetProxyActivatorClassName(proxyInterfaceType), interfaces: new[] { typeof(IProxyActivator) }); AddCreateInstanceMethod(classBuilder, proxyType); return(classBuilder.CreateTypeInfo().AsType()); }
private Type BuildProxyType( CodeBuilderContext context, Type proxyInterfaceType, IDictionary <InterfaceDescription, MethodBodyTypesBuildResult> methodBodyTypesResultsMap) { var classBuilder = CodeBuilderUtils.CreateClassBuilder( context.ModuleBuilder, ns: context.AssemblyNamespace, className: this.CodeBuilder.Names.GetProxyClassName(proxyInterfaceType), baseType: this.proxyBaseType, interfaces: methodBodyTypesResultsMap.Select(item => item.Key.InterfaceType).ToArray()); this.AddGetReturnValueMethod(classBuilder, methodBodyTypesResultsMap); this.AddInterfaceImplementations(classBuilder, methodBodyTypesResultsMap); return(classBuilder.CreateTypeInfo().AsType()); }
public MethodDispatcherBuildResult Build(InterfaceDescription interfaceDescription) { var context = new CodeBuilderContext( assemblyName: this.CodeBuilder.Names.GetMethodDispatcherAssemblyName(interfaceDescription.InterfaceType), assemblyNamespace: this.CodeBuilder.Names.GetMethodDispatcherAssemblyNamespace(interfaceDescription.InterfaceType), enableDebugging: CodeBuilderAttribute.IsDebuggingEnabled(interfaceDescription.InterfaceType)); var result = new MethodDispatcherBuildResult(context); // ensure that the method body types are built var methodBodyTypesBuildResult = this.CodeBuilder.GetOrBuildMethodBodyTypes(interfaceDescription.InterfaceType); // build dispatcher class var classBuilder = CodeBuilderUtils.CreateClassBuilder( context.ModuleBuilder, ns: context.AssemblyNamespace, className: this.CodeBuilder.Names.GetMethodDispatcherClassName(interfaceDescription.InterfaceType), baseType: this.methodDispatcherBaseType); this.AddCreateResponseBodyMethod(classBuilder, interfaceDescription, methodBodyTypesBuildResult); this.AddOnDispatchAsyncMethod(classBuilder, interfaceDescription, methodBodyTypesBuildResult); this.AddOnDispatchMethod(classBuilder, interfaceDescription, methodBodyTypesBuildResult); var methodNameMap = GetMethodNameMap(interfaceDescription); // create the dispatcher type, instantiate and initialize it result.MethodDispatcherType = classBuilder.CreateTypeInfo().AsType(); result.MethodDispatcher = (TMethodDispatcher)Activator.CreateInstance(result.MethodDispatcherType); result.MethodDispatcher.Initialize( interfaceDescription.Id, methodNameMap, methodBodyTypesBuildResult.GetRequestBodyTypes(), methodBodyTypesBuildResult.GetResponseBodyTypes()); context.Complete(); return(result); }