首页 > 解决方案 > .NET Core 中缺少 EnumBuilder 的解决方法

问题描述

我正在尝试将项目从 .NET Framework 转换为 .NET Core,但遇到了System.Reflection.Emit.EnumBuilder.CreateType.NET Core 中未实现的问题。如何在 .NET Core 中动态实现枚举?是否有一些神奇的 CIL 可以做到这一点或以某种方式模拟枚举?

标签: c#.net-coreenumscil

解决方案


对此进行逆向工程需要几个小时,但这里是:

    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 的类型必须与传递给构造函数的基础类型相匹配。


推荐阅读