我的任务是生成一个动态枚举,该枚举具有数据库驱动的值,以便在添加新值时减轻Enum对象的重新编译和部署。枚举将作为内部消费服务的一部分存在。
我认为这种方法的自然和最明显的优点是,任何需要使用该服务的人都会立即知道在开发过程中可用的值。
我不是这种方法的忠实粉丝,但我愿意接受挑战。
以下代码生成一个RuntimeType,但是在我为将其强制转换为Enum而进行的每次尝试时都会抛出错误。
public Enum GenerateDynamicSmsEnumValues<T>(Dictionary<int,string> enumValues)
{
try
{
// Create Base Assembly Objects
AppDomain appDomain = AppDomain.CurrentDomain;
AssemblyName asmName = new AssemblyName("SmsApplicationID");
AssemblyBuilder asmBuilder = appDomain.
DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);
// Create Module and Enumeration Builder Objects
ModuleBuilder modBuilder = asmBuilder.
DefineDynamicModule("SmsApplicationID");
EnumBuilder enumBuilder = modBuilder.
DefineEnum("SmsApplicationID", TypeAttributes.Public, typeof(int));
// Build enumerations
foreach (var pair in enumValues)
enumBuilder.DefineLiteral(pair.Value, pair.Key);
var returnType = enumBuilder.CreateType();
var enm = (object)returnType;
return (Enum)enm; // <-- Error Thrown Here
}
catch(Exception ex)
{
return null;
}
如果我在尝试强制转换之前检查对象,则IsEnum属性设置为true,所以我相信我有我需要的对象。
我无法弄清楚如何将其正确地转换为Enum类型以供任何利用该方法的代码使用。
我也尝试过使用通用模板方法,但问题几乎相同。
如何将其转换为Enum对象???