System.Type classe

Este artigo fornece observações complementares à documentação de referência para essa API.

A Type classe é a raiz da funcionalidade e é a principal maneira de System.Reflection acessar metadados. Use os membros de para obter informações sobre uma declaração de tipo, sobre os membros de um tipo (como construtores, métodos, campos, propriedades e eventos de Type uma classe), bem como o módulo e o assembly no qual a classe é implantada.

Nenhuma permissão é necessária para que o código use o reflection para obter informações sobre tipos e seus membros, independentemente de seus níveis de acesso. Nenhuma permissão é necessária para que o código use o reflection para acessar membros públicos ou outros membros cujos níveis de acesso os tornariam visíveis durante a compilação normal. No entanto, para que seu código use reflexão para acessar membros que normalmente seriam inacessíveis, como métodos privados ou internos, ou campos protegidos de um tipo que sua classe não herda, seu código deve ter ReflectionPermission. Consulte Considerações de segurança para reflexão.

Type é uma classe base abstrata que permite várias implementações. O sistema sempre fornecerá a classe RuntimeTypederivada . Em reflexão, todas as classes que começam com a palavra Runtime são criadas apenas uma vez por objeto no sistema e oferecem suporte a operações de comparação.

Observação

Em cenários de multithreading, não bloqueie Type objetos para sincronizar o acesso aos static dados. Outro código, sobre o qual você não tem controle, também pode bloquear seu tipo de classe. Isso pode resultar em um impasse. Em vez disso, sincronize o acesso a dados estáticos bloqueando um objeto privado static .

Observação

Uma classe derivada pode acessar membros protegidos das classes base do código de chamada. Além disso, o acesso é permitido aos membros da assembleia do código de chamada. Como regra, se você tiver permissão de acesso em código de vinculação antecipada, também terá permissão de acesso em código de vinculação tardia.

Observação

As interfaces que estendem outras interfaces não herdam os métodos definidos nas interfaces estendidas.

Que tipos representa um objeto Type?

Esta classe é thread safe; Vários threads podem ser lidos simultaneamente de uma instância desse tipo. Uma instância da Type classe pode representar qualquer um dos seguintes tipos:

  • Classes
  • Tipos de valor
  • matrizes
  • Interfaces
  • Enumerações
  • Delegados
  • Tipos genéricos construídos e definições de tipos genéricos
  • Argumentos de tipo e parâmetros de tipo de tipos genéricos construídos, definições de tipo genérico e definições de método genérico

Recuperar um objeto Type

O Type objeto associado a um tipo específico pode ser obtido das seguintes maneiras:

  • O método de instância retorna um Type objeto que representa o tipo de uma instânciaObject.GetType. Como todos os tipos gerenciados derivam do Object, o GetType método pode ser chamado em uma instância de qualquer tipo.

    O exemplo a seguir chama o método para determinar o Object.GetType tipo de tempo de execução de cada objeto em uma matriz de objeto.

    object[] values = { "word", true, 120, 136.34, 'a' };
    foreach (var value in values)
        Console.WriteLine("{0} - type {1}", value,
                          value.GetType().Name);
    
    // The example displays the following output:
    //       word - type String
    //       True - type Boolean
    //       120 - type Int32
    //       136.34 - type Double
    //       a - type Char
    
    let values: obj[] = [| "word"; true; 120; 136.34; 'a' |]
    for value in values do
       printfn $"{value} - type {value.GetType().Name}"
    
    // The example displays the following output:
    //       word - type String
    //       True - type Boolean
    //       120 - type Int32
    //       136.34 - type Double
    //       a - type Char
    
    Module Example1
       Public Sub Main()
          Dim values() As Object = { "word", True, 120, 136.34, "a"c }
          For Each value In values
             Console.WriteLine("{0} - type {1}", value, 
                               value.GetType().Name)
          Next
       End Sub
    End Module
    ' The example displays the following output:
    '       word - type String
    '       True - type Boolean
    '       120 - type Int32
    '       136.34 - type Double
    '       a - type Char
    
  • Os métodos estáticos Type.GetType retornam um objeto que representa um Type tipo especificado por seu nome totalmente qualificado.

  • Os Module.GetTypesmétodos , Module.GetTypee e Module.FindTypes retornam Type objetos que representam os tipos definidos em um módulo. O primeiro método pode ser usado para obter uma matriz de Type objetos para todos os tipos públicos e privados definidos em um módulo. (Você pode obter uma instância de por meio do ModuleAssembly.GetModule método ou Assembly.GetModules da Type.Module propriedade.)

  • O System.Reflection.Assembly objeto contém vários métodos para recuperar as classes definidas em um assembly, incluindo Assembly.GetType, Assembly.GetTypese Assembly.GetExportedTypes.

  • O FindInterfaces método retorna uma lista filtrada de tipos de interface suportados por um tipo.

  • O GetElementType método retorna um Type objeto que representa o elemento.

  • Os GetInterfaces métodos e GetInterface retornam Type objetos que representam os tipos de interface suportados por um tipo.

  • O GetTypeArray método retorna uma matriz de objetos que representam os tipos especificados por um conjunto arbitrário de Type objetos. Os objetos são especificados com uma matriz do tipo Object.

  • Os GetTypeFromProgID métodos e GetTypeFromCLSID são fornecidos para a interoperabilidade COM. Eles retornam um objeto que representa o tipo especificado por um TypeProgID ou CLSID.

  • O GetTypeFromHandle método é fornecido para a interoperabilidade. Ele retorna um objeto que representa o tipo especificado por um Type identificador de classe.

  • O operador C# typeof , o operador C++ typeid e o operador Visual Basic GetType obtêm o Type objeto para um tipo.

  • O MakeGenericType método retorna um objeto que representa um tipo genérico construído, que é um tipo construído aberto se sua ContainsGenericParameters propriedade retorna true, e um Type tipo construído fechado caso contrário. Um tipo genérico só pode ser instanciado se estiver fechado.

  • Os MakeArrayTypemétodos , e e retornam objetos que representam, respectivamente, uma matriz de um tipo especificado, um ponteiro para um tipo especificado e MakeByRefTypeType o tipo de um parâmetro de referência (ref em C#, 'byref' em F#, MakePointerTypeByRef em Visual Basic).

Comparar objetos de tipo para igualdade

Um Type objeto que representa um tipo é único, ou seja, duas Type referências de objeto referem-se ao mesmo objeto se e somente se representarem o mesmo tipo. Isso permite a comparação de objetos usando a igualdade de Type referência. O exemplo a seguir compara os Type objetos que representam um número de valores inteiros para determinar se eles são do mesmo tipo.

long number1 = 1635429;
int number2 = 16203;
double number3 = 1639.41;
long number4 = 193685412;

// Get the type of number1.
Type t = number1.GetType();

// Compare types of all objects with number1.
Console.WriteLine("Type of number1 and number2 are equal: {0}",
                  Object.ReferenceEquals(t, number2.GetType()));
Console.WriteLine("Type of number1 and number3 are equal: {0}",
                  Object.ReferenceEquals(t, number3.GetType()));
Console.WriteLine("Type of number1 and number4 are equal: {0}",
                  Object.ReferenceEquals(t, number4.GetType()));

// The example displays the following output:
//       Type of number1 and number2 are equal: False
//       Type of number1 and number3 are equal: False
//       Type of number1 and number4 are equal: True
let number1 = 1635429L
let number2 = 16203
let number3 = 1639.41
let number4 = 193685412L

// Get the type of number1.
let t = number1.GetType()

// Compare types of all objects with number1.
printfn $"Type of number1 and number2 are equal: {Object.ReferenceEquals(t, number2.GetType())}"
printfn $"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}"
printfn $"Type of number1 and number4 are equal: {Object.ReferenceEquals(t, number4.GetType())}"

// The example displays the following output:
//       Type of number1 and number2 are equal: False
//       Type of number1 and number3 are equal: False
//       Type of number1 and number4 are equal: True
Module Example
   Public Sub Main()
      Dim number1 As Long = 1635429
      Dim number2 As Integer = 16203
      Dim number3 As Double = 1639.41
      Dim number4 As Long = 193685412
      
      ' Get the type of number1.
      Dim t As Type = number1.GetType()
      
      ' Compare types of all objects with number1.
      Console.WriteLine("Type of number1 and number2 are equal: {0}",
                        Object.ReferenceEquals(t, number2.GetType()))
      Console.WriteLine("Type of number1 and number3 are equal: {0}",
                        Object.ReferenceEquals(t, number3.GetType()))
      Console.WriteLine("Type of number1 and number4 are equal: {0}",
                        Object.ReferenceEquals(t, number4.GetType()))
   End Sub
End Module
' The example displays the following output:
'       Type of number1 and number2 are equal: False
'       Type of number1 and number3 are equal: False
'       Type of number1 and number4 are equal: True