Partager via


ModuleBuilder.DefineEnum(String, TypeAttributes, Type) Méthode

Définition

Définit un type d'énumération qui est un type valeur avec un champ non statique unique appelé value__ du type spécifié.

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

Paramètres

name
String

Chemin d'accès complet du type d'énumération. name ne peut pas contenir des valeurs Null imbriquées.

visibility
TypeAttributes

Attributs de type pour l'énumération. Un attribut correspond à n'importe quel octet défini par VisibilityMask.

underlyingType
Type

Type sous-jacent pour l'énumération. Ce doit être un type entier intégré.

Retours

Énumération définie.

Exceptions

Des attributs autres que des attributs de visibilité sont fournis.

- ou -

Une énumération portant le nom donné existe dans l'assembly parent de ce module.

- ou -

Les attributs de visibilité ne correspondent pas à la portée de l'énumération. Par exemple, si NestedPublic est spécifié pour visibility alors que l'énumération n'est pas de type imbriqué.

name a la valeur null.

Exemples

L’exemple suivant illustre l’utilisation de DefineEnum pour implémenter une classe d’énumération dans un module dynamique. L’exemple définit une énumération nommée Elevation qui a un type sous-jacent de Int32, et crée deux éléments : Low, avec une valeur de 0 et High, avec une valeur de 1. Une fois le type créé, l’assembly est enregistré avec le nom TempAssembly.dll. Vous pouvez utiliser le Ildasm.exe (désassembleur IL) pour examiner le contenu de cet assembly.

Notes

Avant .NET Framework version 2.0, cet exemple de code ne produit pas une énumération correcte.

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

Remarques

L’énumération définie est une classe dérivée de Enum. Les attributs et SpecialName du value__ champ Private sont définis.

Pour plus d’informations sur les types entiers intégrés qui peuvent être spécifiés comme types sous-jacents d’énumérations, consultez Vue d’ensemble de la bibliothèque de classes.

Notes

Dans les versions 1.0 et 1.1 du .NET Framework, il est nécessaire de définir des énumérations à l’aide TypeBuilder de car EnumBuilder émet des énumérations dont les éléments sont de type Int32 au lieu du type d’énumération. Dans le .NET Framework version 2.0, EnumBuilder émet des énumérations dont les éléments ont le type correct.

Notes

À compter de .NET Framework 2.0 Service Pack 1, ce membre n’a plus besoin ReflectionPermission de l’indicateur ReflectionPermissionFlag.ReflectionEmit . (Consultez Problèmes de sécurité dans l’émission de réflexion.) Pour utiliser cette fonctionnalité, votre application doit cibler .NET Framework 3.5 ou version ultérieure.

S’applique à