internal static Type CreateType(Type interfaceType, Type baseType) { Type type = null; // if the type is already generated, just return it var key = new ChassisManagerRestProxyKey(interfaceType, baseType); if (typeCache.TryGetValue(key, out type)) { return(type); } // create a new type var assemblyName = new AssemblyName(Guid.NewGuid().ToString("N").ToUpper()); var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, string.Concat(assemblyName.Name, ".dll")); var typeBuilder = moduleBuilder.DefineType(string.Concat(interfaceType.Name, assemblyName.Name), TypeAttributes.Public); typeBuilder.SetParent(baseType); typeBuilder.AddInterfaceImplementation(interfaceType); ImplementInterfaceMethods(interfaceType, baseType, typeBuilder); type = typeBuilder.CreateType(); return(type); }
internal static Type CreateType(Type interfaceType, Type baseType) { Type type = null; // if the type is already generated, just return it var key = new ChassisManagerRestProxyKey(interfaceType, baseType); if (typeCache.TryGetValue(key, out type)) { return type; } // create a new type var assemblyName = new AssemblyName(Guid.NewGuid().ToString("N").ToUpper()); var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, string.Concat(assemblyName.Name, ".dll")); var typeBuilder = moduleBuilder.DefineType(string.Concat(interfaceType.Name, assemblyName.Name), TypeAttributes.Public); typeBuilder.SetParent(baseType); typeBuilder.AddInterfaceImplementation(interfaceType); ImplementInterfaceMethods(interfaceType, baseType, typeBuilder); type = typeBuilder.CreateType(); return type; }