ModuleBuilder.DefineEnum(String, TypeAttributes, Type) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menentukan jenis enumerasi yang merupakan jenis nilai dengan satu bidang non-statis yang disebut value__
jenis yang ditentukan.
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
Jalur lengkap jenis enumerasi.
name
tidak boleh berisi null yang disematkan.
- visibility
- TypeAttributes
Atribut jenis untuk enumerasi. Atribut adalah bit apa pun yang ditentukan oleh VisibilityMask.
- underlyingType
- Type
Jenis yang mendasar untuk enumerasi. Ini harus berupa jenis bilangan bulat bawaan.
Mengembalikan
Enumerasi yang ditentukan.
Pengecualian
Atribut selain atribut visibilitas disediakan.
-atau-
Enumerasi dengan nama yang diberikan ada di rakitan induk modul ini.
-atau-
Atribut visibilitas tidak cocok dengan cakupan enumerasi. Misalnya, NestedPublic ditentukan untuk visibility
, tetapi enumerasi bukan jenis berlapis.
name
adalah null
.
Contoh
Contoh berikut menggambarkan penggunaan DefineEnum
untuk mengimplementasikan kelas enumerasi dalam modul dinamis. Contoh mendefinisikan enumerasi bernama Elevation
yang memiliki jenis yang mendasar dari Int32, dan membuat dua elemen: Low
, dengan nilai 0, dan High
, dengan nilai 1. Setelah jenis dibuat, assembly disimpan dengan nama TempAssembly.dll
. Anda dapat menggunakan Ildasm.exe (IL Disassembler) untuk memeriksa konten perakitan ini.
Catatan
Sebelum .NET Framework versi 2.0, contoh kode ini tidak menghasilkan enumerasi yang benar.
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
Keterangan
Enum yang ditentukan adalah kelas turunan dari Enum. Bidang value__
memiliki Private atribut dan SpecialName diatur.
Untuk informasi selengkapnya tentang jenis bilangan bulat bawaan yang dapat ditentukan sebagai jenis enumerasi yang mendasar, lihat Gambaran Umum Pustaka Kelas.
Catatan
Dalam .NET Framework versi 1.0 dan 1.1, perlu untuk menentukan enumerasi yang digunakan TypeBuilder karena EnumBuilder memancarkan enumerasi yang elemennya berjenis Int32 alih-alih jenis enumerasi. Dalam .NET Framework versi 2.0, EnumBuilder memancarkan enumerasi yang elemennya memiliki jenis yang benar.
Catatan
Dimulai dengan .NET Framework 2.0 Paket Layanan 1, anggota ini tidak lagi memerlukan ReflectionPermission bendera ReflectionPermissionFlag.ReflectionEmit . (Lihat Masalah Keamanan dalam Pancaran Pantulan.) Untuk menggunakan fungsionalitas ini, aplikasi Anda harus menargetkan .NET Framework 3.5 atau yang lebih baru.