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

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

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

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

Исключения

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

-или-

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

-или-

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

name имеет значение null.

Примеры

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

Примечание

До платформа .NET Framework версии 2.0 этот пример кода не создает правильное перечисление.

using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;

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 = gcnew 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 Int32.
    EnumBuilder^ eb = 
            mb->DefineEnum("Elevation", TypeAttributes::Public, int::typeid);
      
    // Define two members, "High" and "Low".
    eb->DefineLiteral("Low", (Object^) 0);
    eb->DefineLiteral("High", 1);

    // Create the type and save the assembly.
    Type^ finished = eb->CreateType();
    ab->Save(aName->Name + ".dll");

    for each (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
 */
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 с пакетом обновления 1 (SP1), этому члену ReflectionPermissionFlag.ReflectionEmit больше не требуется ReflectionPermission использовать флаг . (См. раздел Проблемы безопасности при отражении.) Чтобы использовать эту функцию, приложение должно быть ориентировано на платформа .NET Framework 3.5 или более поздней версии.

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