public Type build() { buildManagedDelegates(tInterface, prefabs.OfType <CustomMarshallerMethod>()); // Create the proxy type TypeBuilder tb = createType(tInterface); List <Type> ctorArgsList = new List <Type>(); ctorArgsList.AddRange(constructorArguments); // Create readonly fields FieldBuilder[] fields = new FieldBuilder[prefabs.Length]; for (int i = 0; i < prefabs.Length; i++) { var pf = prefabs[i]; fields[i] = pf.emitField(tb); Type t = pf.tCtorArg; if (null != t) { ctorArgsList.Add(t); } } // Create the constructor constructorArgumentTypes = ctorArgsList.ToArray(); addConstructor(tb, constructorArgumentTypes, fields, prefabs); BaseInterfaces baseInterfaces = BaseInterfaces.createIfNeeded(tb, tInterface); PropertiesBuilder properties = PropertiesBuilder.createIfNeeded(tInterface); // Create methods var conventions = tInterface.GetCustomAttribute <CustomConventionsAttribute>(); for (int i = 0; i < methods.Length; i++) { MethodBuilder mb = declareMethod(tb, methods[i]); prefabs[i].emitMethod(mb, fields[i], conventions); tb.DefineMethodOverride(mb, methods[i]); baseInterfaces?.implementedMethod(mb, methods[i].Name); properties?.implement(tb, methods[i], mb); } // Finalize the proxy type return(tb.CreateType()); }