Метод Описание
DefineEnum() Используется для генерирования определения перечня .NET
DefineResource() Определяет управляемый встроенный ресурс, который должен храниться в данном модуле
DefineType() Конструирует TypeBuilder, который позволяет определять типы значений, интерфейсы и типы класса (в том числе и делегаты)

Ключевым членом класса ModuleBuilder, о котором следует знать, является DefineType(). Вдобавок к указанию имени типа (в виде простой строки), вы должны использовать перечень System.Reflection.TypeAttributes, чтобы непосредственно описать формат типа. Основные члены перечня TypeAttributes представлены в табл. 15.12.

Таблица 15.12. Подборка элементов перечня TypeAttributes 

Член Описание
Abstract Указывает абстрактный тип
Class Указывает тип класса
Interface Указывает тип интерфейса
NestedAssembly Указывает, что класс вложен в область видимости компоновочного блока и поэтому доступен только для методов соответствующего компоновочного блока
NestedFamAndAssem Указывает, что класс вложен в область видимости семейства и компоновочного блока и поэтому доступен только для методов, принадлежащих пересечению соответствующего семейства и компоновочного блока
NestedFamily Указывает, что класс вложен в область видимости семейства и поэтому доступен только для методов соответствующего типа и его подтипов
NestedFamORAssem Указывает, что класс вложен в область видимости семейства или компоновочного блока и поэтому доступен только для методов, принадлежащих объединению соответствующего семейства и компоновочного блока
NestedPrivate Указывает вложенный класс с приватной областью видимости
NestedPublic Указывает вложенный класс с общедоступной областью видимости
NotPublic Указывает класс, не являющийся открытым
Public Указывает открытый класс
Sealed Указывает изолированный класс, который не может быть расширен
Serializable Указывает класс, допускающий сериализацию
<p>Генерирование типа HelloClass и принадлежащей ему строковой переменной</p>

Теперь вы понимаете роль метода ModuleBuilder.CreateType(), и пришло время выяснить, как сгенерировать открытый тип класса HelloWorld и приватную строковую переменную.

// Определение открытого класса MyAssembly.HelloWorld.

TypeBuilder helloWorldClass = module.DefineType("MyAssembly.HelloWorld", TypeAttributes.Public);

// Определение принадлежащей классу приватной переменной String

// с именем theMessage.

FieldBuilder msgField =hellоWоrldclass.DefineField("theMessage", typeof(string), FieldAttributes.Private);

Обратите внимание на то, что метод TypeBuilder.DefineField() обеспечивает доступ к типу FieldBuilder. Класс TypeBuilder определяет также другие методы, обеспечивающие доступ к другим типам "построителя". Например, DefineConstructor() возвращает ConstructorBuilder.DefineProperty() – PropertyBuilder и т.д.

<p>Генерирование конструкторов</p>
Перейти на страницу:

Похожие книги