无法将System.RuntimeType类型的对象强制转换为System.Enum

时间:2017-12-19 18:45:44

标签: c# reflection enums casting

我的任务是生成一个动态枚举,该枚举具有数据库驱动的值,以便在添加新值时减轻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对象???

0 个答案:

没有答案