Partilhar via


Definindo um tipo com reflexão Emit

Tipos são definidos no escopo do módulo dinâmico usando o ModuleBuilder.DefineType método. DefineType retorna um TypeBuilder. Neste tópico, o nome do tipo é sempre um nome de caminho completo que inclui o namespace.Por exemplo, se o nome do tipo é Aaa.Bbb.Ccc, Aaa.Bbb é considerado o espaço para nome.

Emissão de reflexão fornece as seguintes opções para definir os tipos:

  • Defina uma classe ou interface com o nome fornecido.

  • Defina uma classe ou interface com o nome fornecido e os 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 implementa a classe.

  • Defina uma classe com o nome fornecido, atributos, classe base e dimensionar de remessa.

  • Defina uma classe com o nome fornecido, atributos, classe base e o dimensionar de classe sistema autônomo um todo.

  • Defina uma classe com o nome fornecido, atributos, classe base, dimensionar de remessa e o dimensionar de classe sistema autônomo um todo.

Para um tipo é usado, a TypeBuilder.CreateType método deve ser chamado. CreateType conclui a criação do tipo.Após a telefonar ao CreateType, o chamador pode criar uma instância do tipo (usando o Activator.CreateInstance método) e chamar os membros do tipo (usando o Type.InvokeMember método). É um erro para chamar métodos de alterar a implementação de um tipo após CreateType tiver sido chamado.Por exemplo, o common linguagem tempo de execução lança uma exceção se o chamador tenta adicionar novos membros a um tipo.

Um inicializador de classe é criado usando o TypeBuilder.DefineTypeInitializer método. DefineTypeInitializer retorna um ConstructorBuilder.

Tipos aninhados são definidos usando um do TypeBuilder.DefineNestedType métodos.

The TypeBuilder.AddDeclarativeSecurity método adiciona segurança declarativa para um tipo que está sendo criado. AddDeclarativeSecurity pode ser chamado várias vezes com cada telefonar especificando uma ação de segurança (sistema autônomo, por exemplo, Por solicitação, Declarar, Negar) e um conjunto de permissões que a ação se aplica.

Atributos

  • Interfaces são especificados usando o TypeAttributes.Interface and TypeAttributes.Abstract atributos.

  • Classes concretas (classes não podem ser estendidos) são especificados usando o TypeAttributes.Sealed atributo.

  • Vários atributos determinam a visibilidade de tipo.Consulte a descrição do TypeAttributes enumeração.

  • If TypeAttributes.LayoutSequential for especificado, o carregador de classe contemple campos na ordem em que eles são lidos no metadados.O carregador de classe considera o dimensionar especificado de remessa, mas ignora qualquer deslocamentos de campo especificado.Os metadados preserva a ordem na qual as definições de campo são emitidas.Mesmo através de uma mesclagem, os metadados não irão reordenar as definições de campo.O carregador obedecem a deslocamentos de campo especificado somente se TypeAttributes.ExplicitLayout é especificado.

Problemas conhecidos

  • Emissão de reflexão não verifica se uma classe não abstrata que implementa uma interface tem implementado todos os métodos declarados na interface.No entanto, se a classe não implementa todos os métodos declarados em uma interface, o tempo de execução não carrega a classe.

  • Embora TypeBuilder é derivado de Tipo, alguns dos métodos abstratos definidos o Tipo classe não são totalmente implementado TypeBuilder.Esses TypeBuilder métodos lançam o NotSupportedException. A funcionalidade desejada pode ser obtida Recuperando o tipo criado usando Type.GetType ou Assembly.GetType e reflete o tipo recuperado.

Consulte também

Outros recursos

Usando o reflexão Emit