在程序运行时动态建立枚举类型及其包含的枚举项.这样我们就可以把枚举项放在web.config这样的xml文件中.便于随时更新,同时还不用重新编译程序.
      这里,我们要用到System.Reflection.Emit 命名空间.它提供了EnumBuilder类,用来在运行是动态建立枚举类型.
       (Emit空间中还包含了许多其他Builder类,方便大家在程序运行时建立"程序集","类","事件"等等)
      

EnumBuilder 类 说明并表示枚举类型。
命名空间: System.Reflection.Emit
程序集: mscorlib(在 mscorlib.dll 中)
下面的代码示例演示了如何在动态程序集中使用 EnumBuilder 构造枚举。该示例定义一个名为 Elevation 的枚举,其基础类型为 Int32,并且创建两个元素:值为 0 的 Low 和值为 1 的 High。创建完类型后,使用 TempAssembly.dll 名称来保存程序集。可以使用 MSIL 反汇编程序 (Ildasm.exe)检查此程序集的内容。
下面是具体的代码实现:
using System;
using System.Reflection;
using System.Reflection.Emit;
class Example
{
public static void Main()
{
// 在当前的线程下获取当前应用程序的域.
AppDomain currentDomain = AppDomain.CurrentDomain;
//在当前应用程序的域.内创建一个动态程序集
// 并且允许到磁盘上
AssemblyName aName = new AssemblyName("TempAssembly");
AssemblyBuilder ab = currentDomain.DefineDynamicAssembly(
aName, AssemblyBuilderAccess.RunAndSave);
//"TempAssembly"程序集下创建一个动态模块这个模块和程序集具有相同的名字
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
//定义一个名为"Elevation"的枚举型值
EnumBuilder eb = mb.DefineEnum("Elevation", TypeAttributes.Public, typeof(int));
//定义两个成员, "High" 和 "Low".

 
eb.DefineLiteral("Low", 0);
eb.DefineLiteral("High", 1);
// 创建类型兵保存程序集
Type finished = eb.CreateType();
ab.Save(aName.Name + ".dll");
foreach( object o in Enum.GetValues(finished) )
{
Console.WriteLine("{0}.{1} = {2}", finished, o, ((int) o));
}
}
}
/* 下面是一个调用的例子
Elevation.Low = 0
Elevation.High = 1