Compartilhar via


Visão geral de reflexão e genéricos

Existem duas chaves para compreender como reflexão trata tipos genéricos e métodos:

  • Os parâmetros de tipo de definições de tipo genérico e definições de método genérico são representados por instâncias do Type classe.

    Observação:

    Muitas propriedades e métodos de Type ter um comportamento diferente quando um Type objeto representa um parâmetro de tipo genérico. Essas diferenças são documentadas nos tópicos de propriedade e método.Por exemplo, consulte IsAutoClass e DeclaringType. Além disso, alguns membros são válido somente quando um Type objeto representa um parâmetro de tipo genérico. Por exemplo, ver GetGenericTypeDefinition.

  • Se um instância de Type representa um tipo genérico, e, em seguida, ele inclui uma matriz de tipos que representam os parâmetros de tipo (para definições de tipo genérico) ou os argumentos de tipo (para tipos construídos). O mesmo é verdadeiro de uma instância do MethodInfo classe que representa um método genérico.

Reflexão fornece métodos de Type e MethodInfo que permitem que você acessar a matriz de parâmetros de tipo e para determinar se uma instância de Type representa um parâmetro de tipo ou um tipo real.

Por exemplo o código que demonstra os métodos abordados aqui, consulte Como: Examinar e instanciar tipos genéricos com reflexão.

Discussão a seguir assume familiaridade com a terminologia de genéricos, sistema autônomo a diferença entre tipos de parâmetros e sistema autônomo argumentos e em aberto ou tipos construídos fechado.Para obter mais informações, consulte Visão geral das classes genéricas no .NET Framework.

Este é um tipo genérico ou método?

Quando você usar reflexão para examinar um tipo desconhecido, representado por uma instância de Type, use o IsGenericType propriedade para determinar se o tipo desconhecido é genérico. Ela retornará true Se o tipo é genérico. Da mesma forma, quando você examinar um método desconhecido, representada por uma ocorrência do MethodInfo classe, use o IsGenericMethod propriedade para determinar se o método é genérico.

Este é um tipo genérico ou método definição?

Use o IsGenericTypeDefinition propriedade para determinar se um Type objeto representa uma definição de tipo genérico e usar o IsGenericMethodDefinition método para determinar se um MethodInfo representa uma definição de método genérico.

Definições de tipo e método genéricas são os modelos do qual instantiable tipos são criados.Tipos genéricos na biblioteca de classes do .NET estrutura, sistema autônomo Dictionary<TKey, TValue>, são definições de tipo genérico.

O tipo ou método em aberto ou Closed?

Um tipo genérico ou método está fechado se tipos instantiable tiverem sido substituídos para todos os seus parâmetros de tipo, incluindo todos os parâmetros de tipo de todos os tipos de delimitador.Você só pode criar uma instância de um tipo genérico se ela estiver fechada.The Type.ContainsGenericParameters propriedade para retornar true Se um tipo estiver aberta. Para métodos, a MethodInfo.ContainsGenericParameters método executa a mesma função.

Gerando Closed tipos genéricos

Depois que você tiver uma definição de tipo ou método genérica, use o MakeGenericType método para criar um tipo genérico fechado ou a MakeGenericMethod método para criar um MethodInfo de um método genérico fechado.

Obtendo o tipo genérico ou definição de método

Se você tiver um tipo genérico em aberto ou um método que não é um tipo genérico ou definição de método, você não pode criar instâncias dele e não é possível fornecer tipos dos parâmetros que estão faltando.Você deve ter uma definição de tipo ou método genérica.Use o GetGenericTypeDefinition método para obter a definição de tipo genérico ou o GetGenericMethodDefinition método para obter a definição do método genérico.

Por exemplo, se você tiver um Type objeto que representa Dictionary<int, string> (Dictionary(Of Integer, String) no Visual Basic) e você deseja criar o tipo Dictionary<string, MyClass>, você pode usar o GetGenericTypeDefinition método para obter um Type representando Dictionary<TKey, TValue> e, em seguida, use o MakeGenericType método para produzir um Type representando Dictionary<int, MyClass>.

Para obter um exemplo de um tipo genérico em aberto que não é um tipo genérico, consulte "Parâmetro de tipo ou argumento de tipo", posteriormente neste tópico.

Examinando os argumentos de tipo e parâmetros de tipo

Use o Type.GetGenericArguments método para obter uma matriz de Type objetos que representam os tipos de parâmetros ou argumentos de tipo de um tipo genérico e usam o MethodInfo.GetGenericArguments método para fazer o mesmo de um método genérico.

Se você souber que um Type objeto representa um parâmetro de tipo, há muitas outras perguntas reflexão pode responder. Você pode determinar fonte o parâmetro do tipo de, sua posição e suas restrições.

Parâmetro de tipo ou argumento de tipo

Para determinar se um determinado elemento da matriz é um parâmetro de tipo ou um argumento de tipo, use o IsGenericParameter propriedade. The IsGenericParameter propriedade é true Se o elemento é um parâmetro de tipo.

Um tipo genérico pode ser em aberto sem ser uma definição de tipo genérico, caso em que ele tem uma mistura de argumentos de tipo e parâmetros de tipo.Por exemplo, o código a seguir, de classe D deriva de um tipo criado substituindo o primeiro parâmetro de tipo de D para o segundo parâmetro de tipo de B.

class B<T, U> {}
class D<V, W> : B<int, V> {}
Class B(Of T, U)
End Class
Class D(Of V, W)
    Inherits B(Of Integer, V)
End Class
generic<typename T, typename U> ref class B {};
generic<typename V, typename W> ref class D : B<int, V> {};

Se você obtiver um Type objeto que representa D<V, W> e usar o BaseType propriedade para obter seu tipo de base resultante type B<int, V> estiver aberta, mas não é uma definição de tipo genérico.

fonte de um parâmetro genérico

Um parâmetro de tipo genérico pode ser do tipo de que análise, de um tipo delimitador ou de um método genérico.Você pode determinar fonte do parâmetro de tipo genérico da seguinte maneira:

  • Primeiro, use o DeclaringMethod propriedade para determinar se o parâmetro de tipo é proveniente de um método genérico. Se o valor da propriedade não é uma referência nula (Nothing no Visual Basic), em seguida, fonte é um método genérico.

  • Se a fonte não for um método genérico, use o DeclaringType propriedade para determinar o tipo genérico do parâmetro de tipo genérico pertence.

Se o parâmetro de tipo pertencer a um método genérico, o DeclaringType propriedade retorna o tipo declarado o método genérico, que é irrelevante.

Posição de um parâmetro genérico

Em raras situações, é necessário determinar a posição de um parâmetro de tipo na lista de parâmetros de tipo de sua classe declarativo.Por exemplo, suponha que você possui um Type objeto que representa o B<int, V> Digite do exemplo anterior. The GetGenericArguments método lhe oferece uma lista de argumentos de tipo e ao examinar V Você pode usar o DeclaringMethod e DeclaringType propriedades para descobrir onde ele vem. Você pode usar o GenericParameterPosition propriedade para determinar sua posição na lista Tipo de parâmetro onde ele foi definido. Neste exemplo, V está na posição 0 (zero) na lista Tipo de parâmetro onde ele foi definido.

Tipo de base e restrições de interface

Use o GetGenericParameterConstraints método para obter o tipo de base restrições restrição e interface de um parâmetro de tipo. A ordem dos elementos da matriz não é significante.Um elemento representa uma restrição de interface que é um tipo de interface.

Restrições especiais

The GenericParameterAttributes propriedade obtém um GenericParameterAttributes valor que indica as restrições especiais. Um parâmetro de tipo pode ser restrito para ser um tipo de referência, um tipo de valor não nulo e tem um construtor padrão.

Constantes

Para obter uma tabela das condições invariável para termos comuns em reflexão para tipos genéricos, consulte Type.IsGenericType. Para termos adicionais relacionadas aos métodos genéricos, consulte MethodInfo.IsGenericMethod.

Consulte também

Tarefas

Como: Examinar e instanciar tipos genéricos com reflexão

Conceitos

Visão geral das classes genéricas no .NET Framework

Exibindo informações de tipo

Referência

Type

MethodInfo

Type.IsGenericType

MethodInfo.IsGenericMethod