Reflexão no .NET

As classes no namespace System.Reflection, juntamente com System.Type permitem que você obtenha informações sobre os assemblies carregados e os tipos definidos neles, como classes, interfaces e tipos de valor (ou seja, estruturas e enumerações). Você também pode usar a reflexão para criar instâncias de tipo em tempo de execução e para invocá-los e acessá-los.

Os assemblies contêm módulos, os módulos contêm tipos e tipos contêm membros. A reflexão fornece objetos que encapsulam assemblies, módulos e tipos. É possível usar a reflexão para criar dinamicamente uma instância de um tipo, associar o tipo a um objeto existente ou obter o tipo de um objeto existente. Você pode então invocar os métodos do tipo ou acessar suas propriedades e campos. Usos típicos da reflexão incluem o seguinte:

  • Use Assembly para definir e carregar assemblies, carregar módulos que estão listados no manifesto do assembly e localizar um tipo nesse assembly e criar uma instância dela.
  • Use Module para descobrir informações como o assembly que contém o módulo e as classes 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, os parâmetros, os modificadores de acesso (como public ou private) e os detalhes de implementação (como abstract ou virtual) de um construtor. Use o método GetConstructors ou o GetConstructor de um Type para invocar um construtor específico.
  • Use MethodInfo para descobrir informações como o nome, o tipo de retorno, os parâmetros, os modificadores de acesso e os detalhes de implementação (como abstract ou virtual) de um método. Use o método GetMethods ou o GetMethod de um Type para invocar um método específico.
  • Use FieldInfo para descobrir informações como o nome, os modificadores de acesso e detalhes de implementação (como static) de um campo e para obter ou definir os valores de campo.
  • Use EventInfo para descobrir informações como o nome, o tipo de dados do manipulador de eventos, os atributos personalizados, o tipo de declaração e o tipo refletido de um evento e para adicionar ou remover manipuladores de evento.
  • Use PropertyInfo para descobrir informações como o nome, o tipo de dados, o tipo de declaração, o tipo refletido e o status somente leitura ou gravável de uma propriedade e para obter ou definir os valores da propriedade.
  • Use ParameterInfo para descobrir informações como o nome do 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 ao trabalhar no MetadataLoadContext ou contexto de somente reflexão (.NET Framework). CustomAttributeData permite que você examine atributos sem criar instâncias deles.

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

A reflexão também pode ser usada para criar navegadores de tipo, que permitem aos usuários selecionar tipos e, em seguida, exibir as informações sobre esses tipos.

Há outros usos para reflexão. Os compiladores de linguagens como o JScript usam reflexão para criar tabelas de símbolos. As classes no namespace System.Runtime.Serialization usam reflexão para acessar dados e para determinar quais campos persistir. As classes do namespace System.Runtime.Remoting usa a reflexão indiretamente por meio da serialização.

Tipos do runtime na 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, ao usar a reflexão, você não trabalha diretamente com essas classes, a maioria das quais é abstrata (MustInherit no Visual Basic). Em vez disso, você trabalha com tipos fornecidos pelo CLR (Common Language Runtime).

Por exemplo, quando você usa o operador typeof C# (GetType no Visual Basic) para obter um objeto Type, o objeto é na verdade um RuntimeType. RuntimeType deriva de Type e fornece implementações de todos os métodos abstratos.

Essas classes de runtime são internal (Friend no Visual Basic). Elas não são documentadas separadamente de suas classes base porque seu comportamento é descrito na documentação da classe base.

Referência