Classe System.Type

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

La Type classe è la radice della System.Reflection funzionalità ed è il modo principale per accedere ai metadati. Utilizzare i membri di Type per ottenere informazioni su una dichiarazione di tipo, sui membri di un tipo ,ad esempio costruttori, metodi, campi, proprietà ed eventi di una classe, nonché il modulo e l'assembly in cui viene distribuita la classe .

Non sono necessarie autorizzazioni per l'uso della reflection da parte del codice per ottenere informazioni sui tipi e sui relativi membri, indipendentemente dai livelli di accesso. Non sono necessarie autorizzazioni per l'uso della reflection da parte del codice per accedere ai membri pubblici o ad altri membri i cui livelli di accesso li renderebbero visibili durante la normale compilazione. Tuttavia, affinché il codice usi la reflection per accedere ai membri che normalmente sarebbero inaccessibili, ad esempio metodi privati o interni o campi protetti di un tipo che la classe non eredita, il codice deve avere ReflectionPermission. Vedere Considerazioni sulla sicurezza per la reflection.

Type è una classe base astratta che consente più implementazioni. Il sistema fornirà sempre la classe RuntimeTypederivata . In reflection, tutte le classi che iniziano con la parola Runtime vengono create una sola volta per oggetto nel sistema e supportano le operazioni di confronto.

Nota

Negli scenari di multithreading non bloccare Type gli oggetti per sincronizzare l'accesso ai static dati. Un altro codice, su cui non si dispone di alcun controllo, potrebbe anche bloccare il tipo di classe. Ciò potrebbe comportare un deadlock. Sincronizzare invece l'accesso ai dati statici bloccando un oggetto privato static .

Nota

Una classe derivata può accedere ai membri protetti delle classi di base del codice chiamante. Inoltre, l'accesso è consentito ai membri dell'assembly del codice chiamante. Come regola, se è consentito l'accesso nel codice con associazione anticipata, è anche consentito l'accesso nel codice ad associazione tardiva.

Nota

Le interfacce che estendono altre interfacce non ereditano i metodi definiti nelle interfacce estese.

Quali tipi rappresentano un oggetto Type?

Questa classe è thread-safe; più thread possono leggere simultaneamente da un'istanza di questo tipo. Un'istanza della Type classe può rappresentare uno dei tipi seguenti:

  • Classi
  • Tipi di valori
  • Matrici
  • Interfacce
  • Enumerazioni
  • Delegati
  • Tipi generici costruiti e definizioni di tipi generici
  • Argomenti di tipo e parametri di tipo di tipi costruiti di tipi generici, definizioni di tipi generici e definizioni di metodi generici

Recuperare un oggetto Type

L'oggetto Type associato a un particolare tipo può essere ottenuto nei modi seguenti:

  • Il metodo di istanza Object.GetType restituisce un Type oggetto che rappresenta il tipo di un'istanza di . Poiché tutti i tipi gestiti derivano da Object, il metodo può essere chiamato in un'istanza GetType di qualsiasi tipo.

    Nell'esempio seguente viene chiamato il Object.GetType metodo per determinare il tipo di runtime di ogni oggetto in una matrice di oggetti.

    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
    
  • I metodi statici Type.GetType restituiscono un Type oggetto che rappresenta un tipo specificato dal nome completo.

  • I Module.GetTypesmetodi , Module.GetTypee Module.FindTypes restituiscono Type oggetti che rappresentano i tipi definiti in un modulo. Il primo metodo può essere usato per ottenere una matrice di Type oggetti per tutti i tipi pubblici e privati definiti in un modulo. È possibile ottenere un'istanza di Module tramite il Assembly.GetModule metodo o Assembly.GetModules o tramite la Type.Module proprietà .

  • L'oggetto System.Reflection.Assembly contiene diversi metodi per recuperare le classi definite in un assembly, tra cui Assembly.GetType, Assembly.GetTypese Assembly.GetExportedTypes.

  • Il FindInterfaces metodo restituisce un elenco filtrato di tipi di interfaccia supportati da un tipo.

  • Il GetElementType metodo restituisce un Type oggetto che rappresenta l'elemento .

  • I GetInterfaces metodi e GetInterface restituiscono Type oggetti che rappresentano i tipi di interfaccia supportati da un tipo.

  • Il GetTypeArray metodo restituisce una matrice di Type oggetti che rappresentano i tipi specificati da un set arbitrario di oggetti. Gli oggetti vengono specificati con una matrice di tipo Object.

  • I GetTypeFromProgID metodi e GetTypeFromCLSID vengono forniti per l'interoperabilità COM. Restituiscono un Type oggetto che rappresenta il tipo specificato da un ProgID oggetto o CLSID.

  • Il GetTypeFromHandle metodo viene fornito per l'interoperabilità. Restituisce un Type oggetto che rappresenta il tipo specificato da un handle di classe.

  • L'operatore C# typeof , l'operatore C++ typeid e l'operatore Visual Basic GetType ottengono l'oggetto Type per un tipo.

  • Il MakeGenericType metodo restituisce un Type oggetto che rappresenta un tipo generico costruito costruito, ovvero un tipo costruito aperto se la relativa ContainsGenericParameters proprietà restituisce truee un tipo costruito chiuso in caso contrario. È possibile creare un'istanza di un tipo generico solo se è chiusa.

  • I MakeArrayTypemetodi , MakePointerTypee MakeByRefType restituiscono Type oggetti che rappresentano, rispettivamente, una matrice di un tipo specificato, un puntatore a un tipo specificato e il tipo di un parametro di riferimento (ref in C#, 'byref' in F#, ByRef in Visual Basic).

Confrontare gli oggetti di tipo per verificarne l'uguaglianza

Un Type oggetto che rappresenta un tipo è univoco, ovvero due riferimenti a oggetti Type fanno riferimento allo stesso oggetto se e solo se rappresentano lo stesso tipo. In questo modo è possibile confrontare gli oggetti usando l'uguaglianza dei Type riferimenti. Nell'esempio seguente vengono confrontati gli Type oggetti che rappresentano un numero di valori integer per determinare se sono dello stesso 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