可以xml读入enum的定义,然后动态创建吗?

解决方案 »

  1.   

    可以用发射生成ENUM注意ENUM不是类,是基础类型用Enum.Parse(TYPE, VALUE)注意发射不是反射,发射和反射是对应的有关使用发射动态生成类型的资料在MSDN网站上有,在.NET高级开发里面
      

  2.   

    用Enum的关键是我得知道Type,可以动态生成Type吗?
      

  3.   

    System.String savedfile = "myasembly.dll";
                System.Reflection.AssemblyName name = new System.Reflection.AssemblyName("myassembly");
                System.Reflection.Emit.AssemblyBuilder assmbly = System.AppDomain.CurrentDomain.DefineDynamicAssembly(name, System.Reflection.Emit.AssemblyBuilderAccess.Save);
                System.Reflection.Emit.ModuleBuilder module = assmbly.DefineDynamicModule("mymodule", savedfile, true);
                System.Reflection.Emit.EnumBuilder en = module.DefineEnum("myenm", System.Reflection.TypeAttributes.Public, typeof(System.Int16));
                System.Reflection.Emit.FieldBuilder field0 = en.DefineLiteral("First", (System.Int16)0);
                System.Reflection.Emit.FieldBuilder field1 = en.DefineLiteral("Second", (System.Int16)1);
                System.Reflection.Emit.FieldBuilder field2 = en.DefineLiteral("Third", (System.Int16)2);
                en.CreateType();
                assmbly.Save(savedfile);
      

  4.   

    参考
    System.Reflection.Emit 命名空间
      

  5.   

    To antoniusguo:
    谢谢你的点拨,用System.Reflection.Emit 动态定义了一个Enum type,有没有可能接着利用这个Type来生成一个Instance呢?
    我想做一个Service根据xml读入Enum的定义然后返回这个enum的instance
      

  6.   

    xml里的Enum对于你的程序来说是未知的,已经失去了Enum的意义了。
      

  7.   

    System.Collections.Generic.SortedList<int, System.String> enmValues = new SortedList<int, string>();
                enmValues.Add(0, "First");
                enmValues.Add(1, "Second");
                enmValues.Add(2, "Third");
    //定义类型,这里可以从xml里读取            System.String savedfile = "myasembly.dll";
                System.Reflection.AssemblyName name = new System.Reflection.AssemblyName("myassembly");
                System.Reflection.Emit.AssemblyBuilder assmbly = System.AppDomain.CurrentDomain.DefineDynamicAssembly(name, System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave);
                System.Reflection.Emit.ModuleBuilder module = assmbly.DefineDynamicModule("mymodule", savedfile, true);
                System.Reflection.Emit.EnumBuilder en = module.DefineEnum("myenm", System.Reflection.TypeAttributes.Public, typeof(int));            System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int, System.String>> e = enmValues.GetEnumerator();
                while (e.MoveNext())
                {
                    en.DefineLiteral(e.Current.Value, e.Current.Key);
                }
                System.Type t = en.CreateType();
                //把类型保存起来
                assmbly.Save(savedfile);            //-------------------------------------------------------            System.String current = "First";
                System.Object o = System.Enum.Parse(t, current);
                return o;
      

  8.   

    用在动态生成的方法里面?不过那样和不用动态Enum是一样的
      

  9.   

    动态的好处就是可以手动配置xml,组件重用性高
      

  10.   

    Enum是给程序员用的...运行时不过是整型数而已...你这样做意义何在?
      

  11.   

    恕俺愚昧,Enum一般俺是用在if或switch里,动态生成的话,你怎么传值?又怎么进行判断到底是哪个?
      

  12.   

    To antoniusguo:
    可以直接返回动态生成的Enum对象吗?
    例如你的代码里面动态定义的 myenm 
    我需要实现类似这么一个接口 myenm GetmyenmInstance()
      

  13.   

    myenm
    只是在运行时动态生成的,编译时根本不知道有myenm,
    如果写出myenm GetmyenmInstance();
    肯定是不能通过编译
    最多只有System.Enum GenmyenmInstance();