Definindo um tipo com reflexão emitir

Os tipos são definidos no escopo de um 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 namespace.

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 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 o tamanho de remessa.

  • Defina uma classe com o nome fornecido, atributos, classe base e o tamanho de classe como um todo.

  • Defina uma classe com o nome fornecido, atributos, classe base, o tamanho de remessa e o tamanho de classe como um todo.

Antes de um tipo é 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 chamar 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 foi chamado. Por exemplo, o common language runtime 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.

O TypeBuilder.AddDeclarativeSecurity método adiciona segurança declarativa para um tipo que está sendo criado. AddDeclarativeSecurity pode ser chamado várias vezes com cada chamada, especificando uma ação de segurança (como demanda, Assert, Negar) e um conjunto de permissões que a ação se aplica.

Atributos

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

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

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

  • Se TypeAttributes.LayoutSequential for especificado, o carregador de classe contemple de campos na ordem em que eles são lidos a partir de metadados. O carregador de classe considera o tamanho 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 reordenará as definições de campo. O carregador honrará 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 runtime não carregar a classe.

  • Embora TypeBuilder é derivada de tipo, alguns dos métodos abstratos definidos o tipo classe não são totalmente implementado em TypeBuilder. Essas TypeBuilder métodos lançam o NotSupportedException. A funcionalidade desejada pode ser obtida pela recuperação do tipo criado usando Type.GetType ou Assembly.GetType e refletindo no tipo recuperado.

Consulte também

Outros recursos

Usando a reflexão emitir.