Потребовалось несколько часов, чтобы реконструировать это, но вот оно:
class EnumTypeBuilder
{
private TypeBuilder _enumTypeBuilder;
public EnumTypeBuilder(ModuleBuilder builder, string name, TypeAttributes attributes, Type underlyingType)
{
_enumTypeBuilder = builder.DefineType(name, attributes | TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Sealed, typeof(System.Enum), PackingSize.Unspecified, TypeBuilder.UnspecifiedTypeSize);
FieldBuilder valueFieldBuilder = _enumTypeBuilder.DefineField("value__", underlyingType, FieldAttributes.Public | FieldAttributes.SpecialName | FieldAttributes.RTSpecialName);
}
public void DefineLiteral(string name, object value)
{
FieldBuilder enumerationFieldBuilder = _enumTypeBuilder.DefineField(name, _enumTypeBuilder, FieldAttributes.Static | FieldAttributes.Public | FieldAttributes.Literal);
enumerationFieldBuilder.SetConstant(value);
}
public Type CreateType()
{
return _enumTypeBuilder.CreateType();
}
}
Похоже, это генерирует типы, которые ведут себя точно так же, как Enum, во всех возможных способах. Обратите внимание, что тип, переданный в DefineLiteral, должен соответствовать базовому типу, переданному в конструктор.