private TypeBuilder CreateTypeBuilder(ModuleBuilder moduleBuilder, PortableTypeDefinition typeDefinition)
        {
            var baseType = GetType(typeDefinition.BaseClassName);

            var typeAttributes =
                TypeAttributes.Public |
                TypeAttributes.BeforeFieldInit |
                TypeAttributes.AutoLayout |
                TypeAttributes.Serializable;

            if (typeDefinition.IsAbstract)
            {
                typeAttributes |= TypeAttributes.Abstract;
            }

            if (typeDefinition.IsInterface)
            {
                typeAttributes |= TypeAttributes.Interface;
            }
            else
            {
                typeAttributes |= TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass;
            }

            var typeBuilder = moduleBuilder.DefineType(typeDefinition.ClassName, typeAttributes, baseType);

            return(typeBuilder);
        }
        public Type BuildType(PortableTypeDefinition typeDefinition)
        {
            var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(Guid.NewGuid().ToString()), AssemblyBuilderAccess.Run);
            var moduleBuilder   = assemblyBuilder.DefineDynamicModule(typeDefinition.ModuleName);

            if (typeDefinition.IsEnum)
            {
                var enumType = CreateEnumType(moduleBuilder, typeDefinition);
                return(enumType);
            }

            var typeBuilder = CreateTypeBuilder(moduleBuilder, typeDefinition);

            if (!typeBuilder.IsInterface)
            {
                AddConstructor(typeBuilder);
            }

            AddProperties(typeBuilder, typeDefinition.Properties);
            var type = typeBuilder.CreateTypeInfo().AsType();

            _typeCache[type.FullName] = type;

            return(type);
        }
        private Type CreateEnumType(ModuleBuilder moduleBuilder, PortableTypeDefinition typeDefinition)
        {
            var enumBuilder = moduleBuilder.DefineEnum(typeDefinition.ClassName, TypeAttributes.Public, typeof(int));

            for (int i = 0; i < typeDefinition.EnumNames.Length; i++)
            {
                enumBuilder.DefineLiteral(typeDefinition.EnumNames[i], typeDefinition.EnumValues[i]);
            }

            return(enumBuilder.CreateTypeInfo().AsType());
        }