c# - .NET Core 中缺少 EnumBuilder 的解决方法
问题描述
我正在尝试将项目从 .NET Framework 转换为 .NET Core,但遇到了System.Reflection.Emit.EnumBuilder.CreateType
.NET Core 中未实现的问题。如何在 .NET Core 中动态实现枚举?是否有一些神奇的 CIL 可以做到这一点或以某种方式模拟枚举?
解决方案
对此进行逆向工程需要几个小时,但这里是:
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 的类型必须与传递给构造函数的基础类型相匹配。
推荐阅读
- c# - 在 SignalR 的 HubOptions 上找不到 ClientTimeoutInterval
- github - 当分支需要拉取请求时如何提交到主分支
- ros - ROS IMU 服务、客户端和服务器节点模板
- javascript - 如何检查 React 的父元素中是否存在子元素?
- authentication - Blazor AuthenticationStateProvider 的循环依赖问题
- android - Android 在保存到 SQLITE 时更改像素或图像大小
- c - 在微控制器中复制c中的字符串
- cvxpy - 使用 Mosek + Cvxpy 捕获超时异常
- php - PHP 脚本可在一个站点上运行,但不能在同一台服务器上运行
- elasticsearch - elasticsearch中的错误:无效的快照名称快照已经在进行中