Auf Englisch lesen

Teilen über


Type.IsGenericType Eigenschaft

Definition

Ruft einen Wert ab, der angibt, ob der aktuelle Typ ein generischer Typ ist.

C#
public virtual bool IsGenericType { get; }

Eigenschaftswert

true , wenn der aktuelle Typ ein generischer Typ ist; falseandernfalls .

Beispiele

Im folgenden Codebeispiel wird der Wert der IsGenericTypeEigenschaften , IsGenericTypeDefinition, IsGenericParameterund ContainsGenericParameters für die im Abschnitt Hinweise beschriebenen Typen angezeigt. Erläuterungen zu den Eigenschaftswerten finden Sie in der begleitenden Tabelle unter Hinweise.

C#
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
 */

Hinweise

Verwenden Sie die IsGenericType -Eigenschaft, um zu bestimmen, ob ein Type Objekt einen generischen Typ darstellt. Verwenden Sie die ContainsGenericParameters -Eigenschaft, um zu bestimmen, ob ein Type Objekt einen offenen konstruierten Typ oder einen geschlossenen konstruierten Typ darstellt.

Hinweis

Die IsGenericType Eigenschaft gibt zurück false , wenn der unmittelbare Typ nicht generisch ist. Beispielsweise ist ein Array, dessen Elemente vom Typ A<int> (A(Of Integer) in Visual Basic) sind, selbst kein generischer Typ.

In der folgenden Tabelle sind die invarianten Bedingungen für allgemeine Begriffe zusammengefasst, die in der generischen Reflexion verwendet werden.

Begriff Invariante
generische Typdefinition Die IsGenericTypeDefinition-Eigenschaft ist true.

Definiert einen generischen Typ. Ein konstruierter Typ wird erstellt, indem die MakeGenericType -Methode für ein Type Objekt aufgerufen wird, das eine generische Typdefinition darstellt, und ein Array von Typargumenten angegeben wird.

MakeGenericType kann nur bei generischen Typdefinitionen aufgerufen werden.

Jede generische Typdefinition ist ein generischer Typ (die IsGenericType Eigenschaft ist true), die umgekehrte ist jedoch nicht wahr.
generischer Typ Die IsGenericType-Eigenschaft ist true.

Kann eine generische Typdefinition, ein offen konstruierter Typ oder ein geschlossener konstruierter Typ sein.

Beachten Sie, dass ein Arraytyp, dessen Elementtyp generisch ist, selbst kein generischer Typ ist. Das gleiche gilt für ein Type Objekt, das einen Zeiger auf einen generischen Typ darstellt.
konstruierter Typ öffnen Die ContainsGenericParameters-Eigenschaft ist true.

Beispiele sind ein generischer Typ mit nicht zugewiesenen Typparametern, ein Typ, der in einer generischen Typdefinition oder in einem offenen konstruierten Typ geschachtelt ist, oder ein generischer Typ mit einem Typargument, für das die ContainsGenericParameters -Eigenschaft lautet true.

Es ist nicht möglich, eine instance eines offen konstruierten Typs zu erstellen.

Beachten Sie, dass nicht alle offenen konstruierten Typen generisch sind. Beispielsweise ist ein Array, dessen Elementtyp eine generische Typdefinition ist, nicht generisch, und ein Zeiger auf einen offenen konstruierten Typ ist nicht generisch.
geschlossener konstruierter Typ Die ContainsGenericParameters-Eigenschaft ist false.

Bei rekursiver Untersuchung verfügt der Typ über keine nicht zugewiesenen generischen Parameter.
generischer Typparameter Die IsGenericParameter-Eigenschaft ist true.

Die ContainsGenericParameters-Eigenschaft ist true.

In einer generischen Typdefinition ein Platzhalter für einen Typ, der später zugewiesen wird.
generisches Typargument Kann ein beliebiger Typ sein, einschließlich eines generischen Typparameters.

Typargumente werden als Array von Type Objekten angegeben, die beim Erstellen eines erstellten generischen Typs an die MakeGenericType -Methode übergeben werden. Wenn Instanzen des resultierenden Typs erstellt werden sollen, muss false die ContainsGenericParameters -Eigenschaft für alle Typargumente sein.

Das folgende Codebeispiel und die folgende Tabelle veranschaulichen einige dieser Begriffe und Invarianten. Die Derived -Klasse ist von besonderem Interesse, da ihr Basistyp ein konstruierter Typ ist, der eine Mischung aus Typen und Typparametern in seiner Typargumentliste enthält.

C#
public class Base<T, U> {}

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

    public class Nested {}
}

public class G<T> {}

Die folgende Tabelle zeigt Beispiele, die die Klassen Base, Derivedund verwenden und Gauf diesen aufbauen. Wenn der C++- und C#-Code identisch sind, wird nur ein Eintrag angezeigt.

Beispiel Invarianten
Derived(Of V)

Derived<V>
Für diesen Typ:

IsGenericType ist true.

IsGenericTypeDefinition ist true.

ContainsGenericParameters ist true.
Base(Of String, V)

Base<String,V>

Base<String^,V>
Für diesen Typ:

IsGenericType ist true.

IsGenericTypeDefinition ist false.

ContainsGenericParameters ist true.
Dim d() As Derived(Of Integer)

Derived<int>[] d;

array<Derived<int>^>^ d;
Für den Typ der Variablen d:

IsGenericType ist false , weil d ein Array ist.

IsGenericTypeDefinition ist false.

ContainsGenericParameters ist false.
T, Uund V (überall dort, wo sie angezeigt werden) IsGenericParameter ist true.

IsGenericType ist false , weil es keine Möglichkeit gibt, einen Typparameter auf generische Typen zu beschränken.

IsGenericTypeDefinition ist false.

ContainsGenericParameters ist true , weil T, Uund V selbst generische Typparameter sind. Dies impliziert nichts über Typargumente, die ihnen später zugewiesen werden.
Feldtyp F IsGenericType ist true.

IsGenericTypeDefinition ist false , weil dem Typparameter von Gein Typ zugewiesen wurde. Beachten Sie, dass dies dem Aufruf der MakeGenericType -Methode entspricht.

ContainsGenericParameters ist true , weil der Typ des Felds F über ein Typargument verfügt, bei dem es sich um einen offenen konstruierten Typ handelt. Der konstruierte Typ ist geöffnet, da sein Typargument (d. h. Base) eine generische Typdefinition ist. Dies veranschaulicht die rekursive Natur der IsGenericType Eigenschaft.
Die geschachtelte Klasse Nested IsGenericType ist true, obwohl die Nested Klasse keine eigenen generischen Typparameter aufweist, da sie in einem generischen Typ geschachtelt ist.

IsGenericTypeDefinition ist true. Das heißt, Sie können die MakeGenericType -Methode aufrufen und den Typparameter des eingeschlossenen Typs angeben Derived.

ContainsGenericParameters ist true , weil der einschließende Typ , Derivedüber generische Typparameter verfügt. Dies veranschaulicht die rekursive Natur der ContainsGenericParameters Eigenschaft.

Gilt für:

Produkt Versionen
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Weitere Informationen