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 или более поздней версии.