.NET Core中缺少EnumBuilder的解决方法

问题描述 投票:0回答:1

我正试图将一个项目从.NET Framework转换为.NET Core,但我遇到了一个问题,即 System.Reflection.Emit.EnumBuilder.CreateType 在.NET Core中没有实现。 我如何在.NET Core中动态地实现Enum? 是否有一些神奇的CIL可以做到这一点,或者有什么方法可以模拟一个Enum?

c# .net-core enums cil
1个回答
1
投票

我花了几个小时来逆向工程,但在这里。

    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的类型必须与传入构造函数的底层类型相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.