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). Você também pode usar a reflexão para criar instâncias de tipo em tempo de execução e para invocá-las e acessá-las.
Os assemblies contêm módulos, os módulos contêm tipos e os tipos contêm membros. Reflection fornece objetos que encapsulam assemblies, 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 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
ouprivate
) e detalhes de implementação (comoabstract
ouvirtual
) de um construtor. Use o GetConstructorsGetConstructor ou método de a 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
ouvirtual
) de um método. Use o GetMethodsGetMethod ou método de a 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 descobrir informações como nome, tipo de dados, tipo de declaração, tipo refletido e status somente leitura ou gravável 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 trabalhando no contexto ou MetadataLoadContext somente 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 criar 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. As classes no namespace usam reflexão System.Runtime.Remoting indiretamente por meio 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 você usa o operador C# typeof
(GetType
no Visual Basic) para obter um Type objeto, o objeto é realmente um RuntimeType
arquivo . RuntimeType
deriva e Type 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.