Classe System.Type

Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.

La Type classe est la racine de la System.Reflection fonctionnalité et constitue le moyen principal d’accéder aux métadonnées. Utilisez les membres d’obtenir Type des informations sur une déclaration de type, sur les membres d’un type (tels que les constructeurs, les méthodes, les champs, les propriétés et les événements d’une classe), ainsi que le module et l’assembly dans lequel la classe est déployée.

Aucune autorisation n’est requise pour que le code utilise la réflexion pour obtenir des informations sur les types et leurs membres, quel que soit leur niveau d’accès. Aucune autorisation n’est requise pour que le code utilise la réflexion pour accéder aux membres publics, ou d’autres membres dont les niveaux d’accès les rendent visibles pendant la compilation normale. Toutefois, pour que votre code utilise la réflexion pour accéder aux membres qui seraient normalement inaccessibles, tels que des méthodes privées ou internes, ou des champs protégés d’un type que votre classe n’hérite pas, votre code doit avoir ReflectionPermission. Consultez considérations relatives à la sécurité pour Réflexions ion.

Type est une classe de base abstraite qui autorise plusieurs implémentations. Le système fournit toujours la classe RuntimeTypedérivée . En réflexion, toutes les classes commençant par le runtime word ne sont créées qu’une seule fois par objet dans le système et prennent en charge les opérations de comparaison.

Remarque

Dans les scénarios de multithreading, ne verrouillez Type pas les objets pour synchroniser l’accès aux static données. D’autres codes, sur lesquels vous n’avez aucun contrôle, peuvent également verrouiller votre type de classe. Cela peut entraîner un blocage. Au lieu de cela, synchronisez l’accès aux données statiques en verrouillant un objet privé static .

Remarque

Une classe dérivée peut accéder aux membres protégés des classes de base du code appelant. En outre, l’accès est autorisé aux membres de l’assembly du code appelant. En règle générale, si vous êtes autorisé à accéder dans le code à liaison anticipée, vous êtes également autorisé à accéder dans le code à liaison tardive.

Remarque

Les interfaces qui étendent d’autres interfaces n’héritent pas des méthodes définies dans les interfaces étendues.

Quels types un objet Type représente-t-il ?

Cette classe est thread safe ; plusieurs threads peuvent lire simultanément à partir d’une instance de ce type. Une instance de la Type classe peut représenter l’un des types suivants :

  • Classes
  • Types de valeur
  • Tableaux
  • Interfaces
  • Énumérations
  • Délégués
  • Types génériques construits et définitions de types génériques
  • Arguments de type et paramètres de type de types de types construits, définitions de types génériques et définitions de méthode générique

Récupérer un objet Type

L’objet Type associé à un type particulier peut être obtenu de la manière suivante :

  • La méthode d’instance Object.GetType retourne un Type objet qui représente le type d’une instance. Étant donné que tous les types managés dérivent de Object, la GetType méthode peut être appelée sur une instance de n’importe quel type.

    L’exemple suivant appelle la Object.GetType méthode pour déterminer le type d’exécution de chaque objet dans un tableau d’objets.

    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
    
  • Les méthodes statiques Type.GetType retournent un Type objet qui représente un type spécifié par son nom complet.

  • Les Module.GetTypesobjets , Module.GetTypeet Module.FindTypes méthodes retournent Type des objets qui représentent les types définis dans un module. La première méthode peut être utilisée pour obtenir un tableau d’objets Type pour tous les types publics et privés définis dans un module. (Vous pouvez obtenir une instance de Module via l’instance ou Assembly.GetModules la Assembly.GetModule méthode, ou via la Type.Module propriété.)

  • L’objet System.Reflection.Assembly contient un certain nombre de méthodes pour récupérer les classes définies dans un assembly, notamment Assembly.GetType, Assembly.GetTypeset Assembly.GetExportedTypes.

  • La FindInterfaces méthode retourne une liste filtrée de types d’interface pris en charge par un type.

  • La GetElementType méthode retourne un Type objet qui représente l’élément.

  • Les GetInterfaces méthodes et GetInterface les méthodes retournent Type des objets représentant les types d’interface pris en charge par un type.

  • La GetTypeArray méthode retourne un tableau d’objets Type représentant les types spécifiés par un ensemble arbitraire d’objets. Les objets sont spécifiés avec un tableau de type Object.

  • Les GetTypeFromProgID méthodes et GetTypeFromCLSID les méthodes sont fournies pour l’interopérabilité COM. Ils retournent un Type objet qui représente le type spécifié par un ProgID ou CLSID.

  • La GetTypeFromHandle méthode est fournie pour l’interopérabilité. Elle retourne un Type objet qui représente le type spécifié par un handle de classe.

  • L’opérateur C# typeof , l’opérateur C++ typeid et l’opérateur Visual Basic GetType obtiennent l’objet Type d’un type.

  • La MakeGenericType méthode retourne un Type objet représentant un type générique construit, qui est un type construit ouvert si sa ContainsGenericParameters propriété retourne true, et un type construit fermé dans le cas contraire. Un type générique ne peut être instancié que s’il est fermé.

  • Les MakeArrayTypeobjets , MakePointerTypeet MakeByRefType méthodes retournent Type des objets qui représentent, respectivement, un tableau d’un type spécifié, un pointeur vers un type spécifié et le type d’un paramètre de référence (ref en C#, ' byref' en F#, ByRef en Visual Basic).

Comparer les objets de type pour l’égalité

Objet Type qui représente un type est unique ; autrement dit, deux Type références d’objet font référence au même objet si et uniquement s’ils représentent le même type. Cela permet de comparer des objets à l’aide de l’égalité de Type référence. L’exemple suivant compare les Type objets qui représentent un certain nombre de valeurs entières pour déterminer s’ils sont du même type.

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