Обходной путь для отсутствия EnumBuilder в. NET Core - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь преобразовать проект из. NET Framework в. NET Core, но столкнулся с проблемой, что System.Reflection.Emit.EnumBuilder.CreateType не реализован в. NET Core. Как я могу динамически реализовать Enum в. NET Core? Есть ли какой-нибудь маг c CIL, который сделает это или каким-то образом подражает Enum?

1 Ответ

1 голос
/ 06 мая 2020

Потребовалось несколько часов, чтобы реконструировать это, но вот оно:

    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, должен соответствовать базовому типу, переданному в конструктор.

...