ModuleBuilder.DefineEnum(String, TypeAttributes, Type) Метод

Определение

Определяет тип перечисления, который является типом значения с одним нестатическом полем, называемым 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.EnumBuilder
Public Function DefineEnum (name As String, visibility As TypeAttributes, underlyingType As Type) As EnumBuilder

Параметры

name
String

Полный путь типа перечисления. name не может содержать внедренные значения NULL.

visibility
TypeAttributes

Атрибуты типа для перечисления. Атрибуты — это все биты, определенные с помощью VisibilityMask.

underlyingType
Type

Базовый тип перечисления. Это должен быть встроенный целочисленный тип.

Возвращаемое значение

Определенное перечисление.

Исключения

Предоставляются атрибуты, отличные от атрибутов видимости.

–или–

Перечисление с заданным именем существует в родительской сборке этого модуля.

–или–

Атрибуты видимости не соответствуют области перечисления. Например, NestedPublic указывается для visibility, но перечисление не является вложенным типом.

name равно null.

Примеры

В следующем примере показано использование DefineEnum класса перечисления в динамическом модуле. В примере определяется перечисление Elevation с базовым типом Int32и создает два элемента: Lowсо значением 0 и Highзначением 1. После создания типа сборка сохраняется с именем TempAssembly.dll. Для проверки содержимого этой сборки можно использовать Ildasm.exe (IL Disassembler ).

Note

До .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 набор атрибутов.

Дополнительные сведения о встроенных целочисленных типах, которые можно указать в качестве базовых типов перечислений, см. в обзоре библиотеки классов.

Note

В .NET Framework версии 1.0 и 1.1 необходимо определить перечисления с помощью TypeBuilder, так как EnumBuilder выдает перечисления, элементы которых имеют тип Int32 вместо типа перечисления. В .NET Framework версии 2.0 EnumBuilder выдает перечисления, элементы которых имеют правильный тип.

Применяется к