我正在尝试将一个项目从.NET框架转换到.NET核心,但我遇到了System.Reflection.Emit.EnumBuilder.CreateType
没有在.NET核心中实现的问题。如何在.NET核心中动态实现枚举?有没有一些神奇的CIL可以做到这一点,或者以某种方式模拟Enum?
发布于 2020-05-06 03:18:15
花了几个小时对此进行反向工程,但它是这样的:
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的类型必须与传入构造函数的基础类型匹配。
https://stackoverflow.com/questions/61626772
复制