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()); }