ModuleBuilder.DefineEnum(String, TypeAttributes, Type) 方法   
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
用指定类型的单个非静态字段(称为 value__)定义属于值类型的枚举类型。
public:
 System::Reflection::Emit::EnumBuilder ^ DefineEnum(System::String ^ name, System::Reflection::TypeAttributes visibility, Type ^ underlyingType);public System.Reflection.Emit.EnumBuilder DefineEnum(string name, System.Reflection.TypeAttributes visibility, Type underlyingType);member this.DefineEnum : string * System.Reflection.TypeAttributes * Type -> System.Reflection.Emit.EnumBuilderPublic Function DefineEnum (name As String, visibility As TypeAttributes, underlyingType As Type) As EnumBuilder参数
- name
- String
枚举类型的完整路径。 
              name 不能包含嵌入的 null。
- visibility
- TypeAttributes
枚举的类型特性。 这些特性是由 VisibilityMask 定义的任何位。
- underlyingType
- Type
枚举的基础类型。 此类型必须是一种内置的整数类型。
返回
已定义的枚举。
例外
提供的属性不是可见性属性。
- 或 -
具有给定名称的枚举存在于此模块的父程序集中。
- 或 -
可见性属性与该枚举的范围不匹配。 例如,将 visibility 指定为 NestedPublic,但是枚举不是嵌套类型。
              name 为 null。
示例
以下示例演示了如何使用 DefineEnum 在动态模块中实现枚举类。 该示例定义一个名为 Elevation 的枚举,该枚举的基础类型 Int32为 ,并创建两个元素: Low、值为 0 和 High,值为 1。 创建类型后,将保存程序集,名称 TempAssembly.dll为 。 可以使用 Ildasm.exe (IL 反汇编程序)  来检查此程序集的内容。
注意
在 .NET Framework 2.0 版之前,此代码示例未生成正确的枚举。
using System;
using System.Reflection;
using System.Reflection.Emit;
class Example
{
    public static void Main()
    {
        // Get the current application domain for the current thread.
        AppDomain currentDomain = AppDomain.CurrentDomain;
        // Create a dynamic assembly in the current application domain,
        // and allow it to be executed and saved to disk.
        AssemblyName aName = new AssemblyName("TempAssembly");
        AssemblyBuilder ab = currentDomain.DefineDynamicAssembly(
            aName, AssemblyBuilderAccess.RunAndSave);
        // Define a dynamic module in "TempAssembly" assembly. For a single-
        // module assembly, the module has the same name as the assembly.
        ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
        // Define a public enumeration with the name "Elevation" and an
        // underlying type of Integer.
        EnumBuilder eb = mb.DefineEnum("Elevation", TypeAttributes.Public, typeof(int));
        // Define two members, "High" and "Low".
        eb.DefineLiteral("Low", 0);
        eb.DefineLiteral("High", 1);
        // Create the type and save the assembly.
        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));
        }
    }
}
/* This code example produces the following output:
Elevation.Low = 0
Elevation.High = 1
 */
Imports System.Reflection
Imports System.Reflection.Emit
Module Example
   
    Sub Main()
      
        ' Get the current application domain for the current thread.
        Dim currentDomain As AppDomain = AppDomain.CurrentDomain
      
        ' Create a dynamic assembly in the current application domain, 
        ' and allow it to be executed and saved to disk.
        Dim aName As AssemblyName = New AssemblyName("TempAssembly")
        Dim ab As AssemblyBuilder = currentDomain.DefineDynamicAssembly( _ 
            aName, AssemblyBuilderAccess.RunAndSave)
      
        ' Define a dynamic module in "TempAssembly" assembly. For a single-
        ' module assembly, the module has the same name as the assembly.
        Dim mb As ModuleBuilder = _
            ab.DefineDynamicModule(aName.Name, aName.Name & ".dll")
      
        ' Define a public enumeration with the name "Elevation" and an 
        ' underlying type of Integer.
        Dim eb As EnumBuilder = _
            mb.DefineEnum("Elevation", TypeAttributes.Public, GetType(Integer))
      
        ' Define two members, "High" and "Low".
        eb.DefineLiteral("Low", 0)
        eb.DefineLiteral("High", 1)
        ' Create the type and save the assembly.
        Dim finished As Type = eb.CreateType()
        ab.Save(aName.Name & ".dll")
        For Each o As Object In [Enum].GetValues(finished)
            Console.WriteLine("{0}.{1} = {2}", finished, o, CInt(o))
        Next
   End Sub
End Module
' This code example produces the following output:
'
'Elevation.Low = 0
'Elevation.High = 1
注解
定义的枚举是 的派生类 Enum。 字段 value__ 设置了 Private 和 SpecialName 属性。
有关可指定为基础枚举类型的内置整数类型的详细信息,请参阅 类库概述。
注意
在.NET Framework版本 1.0 和 1.1 中,有必要使用 TypeBuilder 定义枚举,因为 EnumBuilder 会发出元素的类型Int32而不是枚举类型的枚举。 在 .NET Framework版本 2.0 中,EnumBuilder发出其元素具有正确类型的枚举。
注意
从 .NET Framework 2.0 Service Pack 1 开始,此成员不再需要ReflectionPermission标志ReflectionPermissionFlag.ReflectionEmit。 (请参阅反射发出中的安全问题.) 若要使用此功能,应用程序应面向.NET Framework 3.5 或更高版本。