Freigeben über


ModuleBuilder.DefineEnum(String, TypeAttributes, Type) Methode

Definition

Definiert einen Enumerationstyp, der ein Werttyp mit dem einzelnen, nicht statischen Feld value__ des angegebenen Typs ist.

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

Parameter

name
String

Der vollständige Pfad des Enumerationstyps. name darf keine eingebetteten NULL-Werte enthalten.

visibility
TypeAttributes

Die Typattribute für die Enumeration. Die Attribute sind beliebige, durch VisibilityMask definierte Bits.

underlyingType
Type

Der zugrunde liegende Typ für die Enumeration. Dabei muss es sich um einen integrierten ganzzahligen Typ handeln.

Gibt zurück

Die definierte Enumeration.

Ausnahmen

Außer Sichtbarkeitsattributen werden andere Attribute bereitgestellt.

- oder -

Eine Enumeration mit dem angegebenen Namen ist in der übergeordneten Assembly dieses Moduls vorhanden.

- oder -

Die Sichtbarkeitsattribute entsprechen nicht dem Bereich der Enumeration. Beispielsweise ist NestedPublic für visibility angegeben, die Enumeration ist jedoch kein geschachtelter Typ.

name ist null.

Beispiele

Im folgenden Beispiel wird die Verwendung von DefineEnum veranschaulicht, um eine Enumerationsklasse in einem dynamischen Modul zu implementieren. Im Beispiel wird eine Enumeration mit dem Namen Elevation definiert, die einen zugrunde liegenden Typ von Int32aufweist, und zwei Elemente erstellt: Low, mit dem Wert 0 und High, mit dem Wert 1. Nachdem der Typ erstellt wurde, wird die Assembly mit dem Namen TempAssembly.dllgespeichert. Sie können den Ildasm.exe (IL Disassembler) verwenden, um den Inhalt dieser Assembly zu untersuchen.

Hinweis

Vor der .NET Framework Version 2.0 erzeugt dieses Codebeispiel keine richtige Enumeration.

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

Hinweise

Die definierte Enumeration ist eine abgeleitete Klasse von Enum. Für value__ das Feld sind Private Attribute und SpecialName festgelegt.

Weitere Informationen zu den integrierten Ganzzahltypen, die als zugrunde liegende Enumerationstypen angegeben werden können, finden Sie unter Übersicht über die Klassenbibliothek.

Hinweis

In den .NET Framework Versionen 1.0 und 1.1 ist es erforderlich, Enumerationen mithilfe TypeBuilder von zu definieren, da EnumBuilder Enumerationen ausgegeben werden, deren Elemente vom Typ Int32 anstelle des Enumerationstyps sind. In der .NET Framework Version 2.0 werden Enumerationen ausgegeben, EnumBuilder deren Elemente den richtigen Typ aufweisen.

Hinweis

Ab dem .NET Framework 2.0 Service Pack 1 benötigt ReflectionPermission dieses Mitglied nicht mehr das ReflectionPermissionFlag.ReflectionEmit Flag. (Siehe Sicherheitsprobleme in Reflection Emit.) Um diese Funktionalität zu verwenden, sollte Ihre Anwendung auf die .NET Framework 3.5 oder höher abzielen.

Gilt für: