Partilhar via


Reflexão em .NET

As classes no System.Reflection namespace, juntamente com System.Type, permitem obter informações sobre assemblies carregados e os tipos definidos neles, como classes, interfaces e tipos de valor (ou seja, estruturas e enumerações). Também pode usar reflexão para criar instâncias de tipos em tempo de execução e para as invocar e aceder-lhes.

Os assemblies contêm módulos, os módulos contêm tipos e os tipos contêm membros. Reflection disponibiliza objetos que encapsulam conjuntos, módulos e tipos. Você pode usar a reflexão para criar dinamicamente uma instância de um tipo, vincular o tipo a um objeto existente ou obter o tipo de um objeto existente. Em seguida, você pode invocar os métodos do tipo ou acessar seus campos e propriedades. Os usos típicos da reflexão incluem o seguinte:

  • Use Assembly para definir e carregar assemblies, carregar módulos listados no manifesto do assembly e localizar um tipo desse assembly e criar uma instância dele.
  • Use Module para descobrir informações como o assembly que contém o módulo e as classes presentes no módulo. Você também pode obter todos os métodos globais ou outros métodos específicos e não globais definidos no módulo.
  • Use ConstructorInfo para descobrir informações como o nome, parâmetros, modificadores de acesso (como public ou private) e detalhes de implementação (como abstract ou virtual) de um construtor. Use o método GetConstructors ou GetConstructor de um Type para invocar um construtor específico.
  • Use MethodInfo para descobrir informações como nome, tipo de retorno, parâmetros, modificadores de acesso e detalhes de implementação (como abstract ou virtual) de um método. Use o método GetMethods ou GetMethod de um Type para invocar um método específico.
  • Use FieldInfo para descobrir informações como nome, modificadores de acesso e detalhes de implementação (como static) de um campo e para obter ou definir valores de campo.
  • Use EventInfo para descobrir informações como nome, tipo de dados do manipulador de eventos, atributos personalizados, tipo de declaração e tipo refletido de um evento e para adicionar ou remover manipuladores de eventos.
  • Use PropertyInfo para identificar informações como nome, tipo de dados, tipo declarador, tipo refletido e estado de leitura ou escrita de uma propriedade, e para obter ou definir valores de propriedade.
  • Use ParameterInfo para descobrir informações como o nome de um parâmetro, o tipo de dados, se um parâmetro é um parâmetro de entrada ou de saída e a posição do parâmetro em uma assinatura de método.
  • Use CustomAttributeData para descobrir informações sobre atributos personalizados quando estiver a trabalhar no contexto de MetadataLoadContext apenas de reflexão (.NET Framework). CustomAttributeData Permite examinar atributos sem criar instâncias deles.

As classes do System.Reflection.Emit namespace fornecem uma forma especializada de reflexão que permite construir tipos em tempo de execução.

O Reflection também pode ser usado para criar navegadores de tipos, que permitem aos usuários selecionar tipos e, em seguida, exibir as informações sobre esses tipos.

Há outros usos para reflexão. Compiladores para linguagens como JScript usam reflexão para construir tabelas de símbolos. As classes no System.Runtime.Serialization namespace usam reflexão para acessar dados e determinar quais campos persistir. O namespace System.Runtime.Remoting utiliza reflection de forma indireta através da serialização.

Tipos de tempo de execução em reflexão

A reflexão fornece classes, como Type e MethodInfo, para representar tipos, membros, parâmetros e outras entidades de código. No entanto, quando você usa reflexão, você não trabalha diretamente com essas classes, a maioria das quais são abstratas (MustInherit no Visual Basic). Em vez disso, você trabalha com tipos fornecidos pelo Common Language Runtime (CLR).

Por exemplo, quando o utilizador usa o operador C# typeof (GetType no Visual Basic) para obter um objeto Type, o objeto é realmente uma instância RuntimeType. RuntimeType deriva de Type e fornece implementações de todos os métodos abstratos.

Essas classes de tempo de execução são internal (Friend no Visual Basic). Eles não são documentados separadamente de suas classes base, porque seu comportamento é descrito pela documentação da classe base.

Referência