public ILEnumBuilder DefineEnum(string enumName, TypeAttributes attributes)
        {
            if (this.IsBuild)
            {
                throw new DefinitionException("Derlenmiş assembly üzerinde yeni tip tanımlanamaz.");
            }

            if (this._definedEnums.ContainsKey(enumName))
            {
                throw new DefinitionException(enumName + " isimli tür daha önce tanımlanmış.");
            }

            if (this._definedTypes.ContainsKey(enumName))
            {
                throw new DefinitionException(enumName + " isimli tür daha önce tanımlanmış.");
            }

            if (this._compiledTypes.ContainsKey(enumName))
            {
                throw new DefinitionException(enumName + " isimli tür daha önce tanımlanmış.");
            }

            ILEnumBuilder builder = new ILEnumBuilder(this, enumName, attributes);

            this._definedEnums.Add(enumName, builder);
            return(builder);
        }
        public Type CompileType(ILEnumBuilder builder)
        {
            EnumBuilder realBuilder = builder.EnumBuilder;
            Type        createdType = realBuilder.CreateType();

            this._compiledTypes.Add(builder.Name, createdType);
            this._definedEnums.Remove(builder.Name);
            return(createdType);
        }
        public void Build()
        {
            ILEnumBuilder[] definedEnums = new ILEnumBuilder[this._definedEnums.Count];
            this._definedEnums.Values.CopyTo(definedEnums, 0);
            ILTypeBuilder[] definedTypes = new ILTypeBuilder[this._definedTypes.Count];
            this._definedTypes.Values.CopyTo(definedTypes, 0);

            for (int i = 0; i < definedEnums.Length; i++)
            {
                this.CompileType(definedEnums[i]);
            }
            for (int i = 0; i < definedTypes.Length; i++)
            {
                this.CompileType(definedTypes[i]);
            }

            this._isBuild = true;
        }