Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte.
Traduction
Source
Ce sujet n'a pas encore été évalué - Évaluez ce sujet

Type.IsGenericType, propriété

Obtient une valeur indiquant si le type actuel est un type générique.

Espace de noms :  System
Assembly :  mscorlib (dans mscorlib.dll)
public virtual bool IsGenericType { get; }

Valeur de propriété

Type : System.Boolean
true si le type actuel est un type générique ; sinon, false.

Utilisez la propriété IsGenericType pour déterminer si un objet Type représente un type générique. Utilisez la propriété ContainsGenericParameters pour déterminer si un objet Type représente un type construit ouvert ou un type construit fermé.

Remarque Remarque

La propriété IsGenericType retourne la valeur false si le type immédiat n'est pas générique. Par exemple, un tableau dont les éléments sont du type A<int> (A(Of Integer) en Visual Basic) n'est pas lui-même un type générique.

Le tableau suivant résume les conditions invariables pour les termes communs utilisés dans la réflexion générique.

Terme

Invariant

définition de type générique

La propriété IsGenericTypeDefinition est true.

Définit un type générique. Un type construit est créé en appelant la méthode MakeGenericType sur un objet Type qui représente une définition de type générique, et en spécifiant un tableau d'arguments de type.

MakeGenericType peut être appelée seulement sur des définitions de type générique.

Toute définition de type générique est un type générique (la propriété IsGenericType a la valeur true), mais la réciproque n'est pas vraie.

type générique

La propriété IsGenericType est true.

Peut être une définition de type générique, un type construit ouvert ou un type construit fermé.

Notez qu'un type tableau dont le type d'élément est générique n'est pas lui-même un type générique. La même chose est vraie pour un objet Type qui représente un pointeur vers un type générique.

type construit ouvert

La propriété ContainsGenericParameters est true.

Les exemples sont un type générique qui a des paramètres de type non assignés, un type qui est imbriqué dans une définition de type générique ou dans un type construit ouvert, ou un type générique qui a un argument de type pour lequel la propriété ContainsGenericParameters a la valeur true.

Il n'est pas possible de créer une instance d'un type construit ouvert.

Notez que les types construits ouverts ne sont pas tous génériques. Par exemple, un tableau dont le type d'élément est une définition de type générique n'est pas générique, et un pointeur vers un type construit ouvert n'est pas générique.

type construit fermé

La propriété ContainsGenericParameters est false.

Lorsqu'il est examiné itérativement, le type ne possède pas de paramètres génériques non assignés.

paramètre de type générique

La propriété IsGenericParameter est true.

La propriété ContainsGenericParameters est true.

Dans une définition de type générique, espace réservé pour un type qui sera assigné ultérieurement.

argument de type générique

Peut être tout type, y compris un paramètre de type générique.

Les arguments de type sont spécifiés sous la forme d'un tableau d'objets Type passé à la méthode MakeGenericType lors de la création d'un type générique construit. Si des instances du type résultant doivent être créées, la propriété ContainsGenericParameters doit avoir la valeur false pour tous les arguments de type.

L'exemple de code et le tableau suivants illustrent certains de ces termes et invariants. La classe Derived présente un intérêt particulier, car son type de base est un type construit qui possède un mélange de types et de paramètres de type dans sa liste d'arguments de type.


public class Base<T, U> {}

public class Derived<V> : Base<string, V>
{
    public G<Derived <V>> F;

    public class Nested {}
}

public class G<T> {}


Le tableau ci-dessous montre des exemples qui utilisent et tirent parti des classes Base, Derived et G. Lorsque le code C++ est identique au code C#, une seule entrée est indiquée.

Exemple

Invariants

Derived(Of V)

Derived<V>

Pour ce type :

IsGenericType est true.

IsGenericTypeDefinition est true.

ContainsGenericParameters est true.

Base(Of String, V)

Base<String,V>

Base<String^,V>

Pour ce type :

IsGenericType est true.

IsGenericTypeDefinition est false.

ContainsGenericParameters est true.

Dim d() As Derived(Of Integer)

Derived<int>[] d;

array<Derived<int>^>^ d;

Pour le type de variable d :

IsGenericType a la valeur false car d est un tableau.

IsGenericTypeDefinition est false.

ContainsGenericParameters est false.

T, U et V (partout où ils apparaissent)

IsGenericParameter est true.

IsGenericType a la valeur false, car il n'existe aucune façon de contraindre un paramètre de type aux types génériques.

IsGenericTypeDefinition est false.

ContainsGenericParameters est true parce que T, U et V sont eux-mêmes des paramètres de type générique. Cela n'implique rien à propos des arguments de type qui y sont assignés ultérieurement.

Type du champ F

IsGenericType est true.

IsGenericTypeDefinition a la valeur false, car un type a été assigné au paramètre de type de G. Notez que cela équivaut à appeler la méthode MakeGenericType.

ContainsGenericParameters a la valeur true, car le type de champ F a un argument de type qui est un type construit ouvert. Le type construit est ouvert, car son argument de type (à savoir, Base) est une définition de type générique. Cela illustre la nature récursive de la propriété IsGenericType.

Classe imbriquée Nested

IsGenericType a la valeur true, bien que la classe Nested n'ait pas personnellement de paramètre de type générique, car elle est imbriquée dans un type générique.

IsGenericTypeDefinition est true. En d'autres termes, vous pouvez appeler la méthode MakeGenericType et fournir le paramètre de type du type englobant, Derived.

ContainsGenericParameters a la valeur true, car le type englobant, Derived, a des paramètres de type générique. Cela illustre la nature récursive de la propriété ContainsGenericParameters.

L'exemple de code suivant affiche la valeur des propriétés IsGenericType, IsGenericTypeDefinition, IsGenericParameter et ContainsGenericParameters pour les types décrits dans la section Notes. Pour les explications sur les valeurs de propriété, consultez le tableau joint dans la section Notes.


using System;
using System.Reflection;

public class Base<T, U> {}

public class Derived<V> : Base<string, V>
{
    public G<Derived <V>> F;

    public class Nested {}
}

public class G<T> {}

class Example
{
    public static void Main()
    {
        // Get the generic type definition for Derived, and the base
        // type for Derived.
        //
        Type tDerived = typeof(Derived<>);
        Type tDerivedBase = tDerived.BaseType;

        // Declare an array of Derived<int>, and get its type.
        //
        Derived<int>[] d = new Derived<int>[0];
        Type tDerivedArray = d.GetType();

        // Get a generic type parameter, the type of a field, and a
        // type that is nested in Derived. Notice that in order to
        // get the nested type it is necessary to either (1) specify
        // the generic type definition Derived<>, as shown here,
        // or (2) specify a type parameter for Derived.
        //
        Type tT = typeof(Base<,>).GetGenericArguments()[0];
        Type tF = tDerived.GetField("F").FieldType;
        Type tNested = typeof(Derived<>.Nested);

        DisplayGenericType(tDerived, "Derived<V>");
        DisplayGenericType(tDerivedBase, "Base type of Derived<V>");
        DisplayGenericType(tDerivedArray, "Array of Derived<int>");
        DisplayGenericType(tT, "Type parameter T from Base<T>");
        DisplayGenericType(tF, "Field type, G<Derived<V>>");
        DisplayGenericType(tNested, "Nested type in Derived<V>");
    }

    public static void DisplayGenericType(Type t, string caption)
    {
        Console.WriteLine("\n{0}", caption);
        Console.WriteLine("    Type: {0}", t);

        Console.WriteLine("\t            IsGenericType: {0}", 
            t.IsGenericType);
        Console.WriteLine("\t  IsGenericTypeDefinition: {0}", 
            t.IsGenericTypeDefinition);
        Console.WriteLine("\tContainsGenericParameters: {0}", 
            t.ContainsGenericParameters);
        Console.WriteLine("\t       IsGenericParameter: {0}", 
            t.IsGenericParameter);
    }
}

/* This code example produces the following output:

Derived<V>
    Type: Derived`1[V]
                    IsGenericType: True
          IsGenericTypeDefinition: True
        ContainsGenericParameters: True
               IsGenericParameter: False

Base type of Derived<V>
    Type: Base`2[System.String,V]
                    IsGenericType: True
          IsGenericTypeDefinition: False
        ContainsGenericParameters: True
               IsGenericParameter: False

Array of Derived<int>
    Type: Derived`1[System.Int32][]
                    IsGenericType: False
          IsGenericTypeDefinition: False
        ContainsGenericParameters: False
               IsGenericParameter: False

Type parameter T from Base<T>
    Type: T
                    IsGenericType: False
          IsGenericTypeDefinition: False
        ContainsGenericParameters: True
               IsGenericParameter: True

Field type, G<Derived<V>>
    Type: G`1[Derived`1[V]]
                    IsGenericType: True
          IsGenericTypeDefinition: False
        ContainsGenericParameters: True
               IsGenericParameter: False

Nested type in Derived<V>
    Type: Derived`1+Nested[V]
                    IsGenericType: True
          IsGenericTypeDefinition: True
        ContainsGenericParameters: True
               IsGenericParameter: False
 */


.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Pris en charge dans :

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
Cela vous a-t-il été utile ?
(1500 caractères restants)
Contenu de la communauté Ajouter
Annotations FAQ
Microsoft réalise une enquête en ligne pour recueillir votre opinion sur le site Web de MSDN. Si vous choisissez d’y participer, cette enquête en ligne vous sera présentée lorsque vous quitterez le site Web de MSDN.

Si vous souhaitez y participer,