示例#1
0
        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;
        }