System.Reflection.Emit.TypeBuilder classe
Este artigo fornece observações complementares à documentação de referência para essa 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.
O Reflection emit 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 fornecido e atributos.
- 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 TypeBuilder objeto, use o método, MakePointerType método MakeArrayType ou MakeByRefType método, 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 método e invocar membros do tipo usando o Activator.CreateInstanceType.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 enumeração para especificar ainda mais as características do tipo a TypeAttributes 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. Consulte a descrição da TypeAttributes enumeração.
- Se TypeAttributes.SequentialLayout for especificado, o carregador de classes estabelece os campos na ordem em que são lidos a partir dos metadados. O carregador de classes considera o tamanho de embalagem especificado, mas ignora quaisquer deslocamentos 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 do Type, alguns dos métodos abstratos definidos na Type classe não são totalmente implementados na TypeBuilder classe. As chamadas para esses TypeBuilder métodos lançam uma NotSupportedException exceção. A funcionalidade desejada pode ser obtida recuperando o tipo criado usando o ou Assembly.GetType e refletindo sobre o Type.GetType tipo recuperado.