Classe System.Reflection.Emit.TypeBuilder

Observação

Este artigo fornece observações complementares à documentação de referência para esta API.

TypeBuilder é a classe raiz usada para controlar a criação de classes dinâmicas no tempo de execução. 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 fornecido, atributos e classe base.
  • Defina uma classe com o nome fornecido, atributos, classe base e o conjunto de interfaces que a classe implementa.
  • Defina uma classe com o nome fornecido, atributos, classe base e tamanho da embalagem.
  • Defina uma classe com o nome fornecido, atributos, classe base e o tamanho da classe como um todo.
  • Defina uma classe com o nome fornecido, atributos, classe base, tamanho da embalagem e o tamanho da classe como um todo.

Para criar um tipo de matriz, tipo de ponteiro ou tipo byref para um tipo incompleto representado por um objeto TypeBuilder, use o método MakeArrayType, método MakePointerType ou método MakeByRefType, respectivamente.

Antes de um tipo ser 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 instanciar o 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 common language runtime lança 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 TypeBuilder.DefineNestedType métodos.

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 TypeAttributes.Interface atributos e TypeAttributes.Abstract .
  • Classes concretas (classes que não podem ser estendidas) são especificadas usando o TypeAttributes.Sealed atributo.
  • Vários atributos determinam a visibilidade do tipo. Veja a descrição da TypeAttributes enumeração.
  • Se TypeAttributes.SequentialLayout for especificado, o carregador de classes estabelece campos na ordem em que são lidos dos metadados. O carregador de classes considera o tamanho de empacotamento especificado, mas ignora quaisquer offsets de campo especificados. Os metadados preservam a ordem em que 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 tempo de execução não carrega a classe.
  • Embora TypeBuilder seja derivado de Type, alguns dos métodos abstratos Type definidos na classe não são totalmente implementados na TypeBuilder classe. Chamadas para esses TypeBuilder métodos lançam uma NotSupportedException exceção. A funcionalidade desejada pode ser obtida recuperando o tipo criado usando o Type.GetType ou Assembly.GetType e refletindo sobre o tipo recuperado.