Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo fornece comentários complementares à documentação de referência para esta API.
TypeBuilder é a classe raiz usada para controlar a criação de classes dinâmicas no runtime. Ele fornece um conjunto de rotinas que são usadas para definir classes, adicionar métodos e campos e criar a classe dentro de um módulo. Um novo TypeBuilder pode ser criado a partir de um módulo dinâmico chamando o ModuleBuilder.DefineType método, que retorna um TypeBuilder objeto.
A emissão de reflexão fornece as seguintes opções para definir tipos:
- Defina uma classe ou interface com o nome fornecido.
- Defina uma classe ou interface com o nome e os atributos fornecidos.
- Defina uma classe com o nome, os atributos e a classe base fornecidos.
- Defina uma classe com o nome, os atributos, a classe base e o conjunto de interfaces que a classe implementa.
- Defina uma classe com o nome, os atributos, a classe base e o tamanho da embalagem fornecidos.
- Defina uma classe com o nome, os atributos, a classe base e o tamanho da classe como um todo.
- Defina uma classe com o nome, os atributos, a classe base, o tamanho da embalagem e o tamanho da classe como um todo.
Para criar um tipo de matriz, tipo de ponteiro ou tipo de byref para um tipo incompleto representado por um objeto TypeBuilder, use o método MakeArrayType, o método MakePointerType ou o método MakeByRefType, respectivamente.
Antes que um tipo seja usado, o TypeBuilder.CreateType método deve ser chamado. CreateType conclui a criação do tipo. Após a chamada para CreateType, o chamador pode criar uma instância do tipo usando o Activator.CreateInstance método e invocar membros do tipo usando o Type.InvokeMember método. É um erro invocar métodos que alteram a implementação de um tipo após CreateType ter sido chamado. Por exemplo, o CLR (Common Language Runtime) gerará uma exceção se o chamador tentar adicionar novos membros a um tipo.
Um inicializador de classe é criado usando o TypeBuilder.DefineTypeInitializer método. DefineTypeInitializer retorna um ConstructorBuilder objeto.
Os tipos aninhados são definidos chamando um dos métodos TypeBuilder.DefineNestedType.
Atributos
A TypeBuilder classe usa a TypeAttributes enumeração para especificar ainda mais as características do tipo a ser criado:
- As interfaces são especificadas usando os atributos TypeAttributes.Interface e TypeAttributes.Abstract.
- Classes concretas (classes que não podem ser estendidas) são especificadas usando o TypeAttributes.Sealed atributo.
- Diversos atributos determinam a visibilidade do tipo. Veja a descrição da TypeAttributes enumeração.
- Se TypeAttributes.SequentialLayout for especificado, o carregador de classe definirá os campos na ordem em que são lidos dos metadados. O carregador de classe considera o tamanho de empacotamento especificado, mas ignora os deslocamentos de campo especificados. Os metadados preservam a ordem na qual as definições de campo são emitidas. Mesmo em uma mesclagem, os metadados não reordenarão as definições de campo. O carregador honrará os deslocamentos de campo especificados somente se TypeAttributes.ExplicitLayout for especificado.
Problemas conhecidos
- A emissão de reflexão não verifica se uma classe não abstrata que implementa uma interface implementou todos os métodos declarados na interface. No entanto, se a classe não implementar todos os métodos declarados em uma interface, o runtime não carregará a classe.
- Embora TypeBuilder seja derivado de Type, alguns métodos abstratos definidos na classe Type não são totalmente implementados na classe TypeBuilder. As chamadas a esses TypeBuilder métodos geram uma NotSupportedException exceção. A funcionalidade desejada pode ser obtida recuperando o tipo criado usando o Type.GetType ou o Assembly.GetType e refletindo sobre o tipo recuperado.