Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Type.IsGenericType-Eigenschaft

 

Veröffentlicht: Oktober 2016

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

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

public virtual bool IsGenericType { get; }

Eigenschaftswert

Type: System.Boolean

true, wenn der aktuelle Typ ein generischer Typ ist, andernfalls false.

Verwenden der IsGenericType -Eigenschaft können Sie bestimmen, ob ein Type -Objekt einen generischen Typ darstellt. Verwenden der ContainsGenericParameters -Eigenschaft können Sie bestimmen, ob ein Type -Objekt stellt ein offener Typ oder ein geschlossener konstruierter Typ dar.

System_CAPS_noteHinweis

Die IsGenericType -Eigenschaft gibt false Wenn der unmittelbare Typ nicht generisch ist. Z. B. ein Array, dessen Elemente vom Typ A<int> (A(Of Integer) in Visual Basic) ist nicht selbst ein generischer Typ.

In der folgenden Tabelle werden die invariantenbedingungen für häufig verwendete Begriffe, die bei generischer Reflektion verwendet zusammengefasst.

Begriff

Invariante

generische Typdefinition

Die IsGenericTypeDefinition-Eigenschaft ist true.

Definiert einen generischen Typ an. Ein konstruierter Typ erstellt, indem die MakeGenericType Methode für ein Type -Objekt, das eine generische Typdefinition darstellt, und ein Array der Argumente des Typs angeben.

MakeGenericType kann nur für generische Typdefinitionen aufgerufen werden.

Jede generische Typdefinition ist ein generischer Typ (die IsGenericType Eigenschaft true), das Gegenteil trifft jedoch nicht.

generischer Typ

Die IsGenericType-Eigenschaft ist true.

Hierbei kann es sich um eine generische Typdefinition, ein offen konstruierter Typ oder ein geschlossener konstruierter Typ sein.

Beachten Sie, dass ein Array, dessen Elementtyp Typ generisch ist nicht selbst ein generischer Typ ist. Das gleiche gilt für ein Type Objekt, das einen Zeiger auf einen generischen Typ darstellt.

offen konstruierter Typ

Die ContainsGenericParameters-Eigenschaft ist true.

Beispiele sind ein generischer Typ, der nicht zugewiesene Typparameter verfügt, ein Typ, der in einer generischen Typdefinition oder in einem offen konstruierten Typ geschachtelt ist oder ein generischer Typ, für die ein Typargument verfügt, die ContainsGenericParameters Eigenschaft ist true.

Es ist nicht möglich, eine Instanz eines offenen konstruierten Typs erstellen.

Beachten Sie, dass nicht alle offen konstruierte Typen generisch sind. Klicken Sie z. B. ein Array, dessen Elementtyp eine generische Typdefinition ist, ist nicht generisch, und ein Zeiger auf ein offener Typ ist nicht generisch.

geschlossener konstruierter Typ

Die ContainsGenericParameters-Eigenschaft ist false.

Bei einer rekursiven Untersuchung, den Typ weist 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 beliebigen Typs, einschließlich einen generischen Typparameter.

Typargumente werden als Array von angegeben Type Objekte übergeben werden, um die MakeGenericType -Methode, wenn Sie einen konstruierten generischen Typ erstellen. Wenn Instanzen des resultierenden Typs erstellt werden, sind die ContainsGenericParameters Eigenschaft muss false für alle Typargumente.

Im folgenden Codebeispiel und der Tabelle veranschaulichen einige dieser Begriffe und Invarianten. Die Derived Klasse ist von besonderem Interesse, da Basistyp ein konstruierter Typ ist, die eine Mischung aus Typen und Typparametern in die Liste der Argumenttypen aufweist.

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 in den Klassen erstellen und verwenden Base, Derived, und G. Wenn die C++- und C#-Code identisch ist, 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 Variable d:

IsGenericType ist false da d ist ein Array.

IsGenericTypeDefinition ist false.

ContainsGenericParameters ist false.

T, U, und V (bei allen Vorkommen)

IsGenericParameter ist true.

IsGenericType ist false da keine Möglichkeit besteht, einen Typparameter auf generische Typen einzuschränken.

IsGenericTypeDefinition ist false.

ContainsGenericParameters ist true da T, U, und V sind selbst generische Typparameter. Diese bedeutet Informationen zu Typargumenten nicht, die sie später zugewiesen sind.

Der Typ des Felds F

IsGenericType ist true.

IsGenericTypeDefinition ist false da der Typparameter ein Typ zugewiesen wurde G. Beachten Sie, dass dies dem Aufruf der MakeGenericType Methode.

ContainsGenericParameters ist true da der Typ des Felds F ist ein Typargument, das ein offen konstruierter Typ ist. Der konstruierte Typ ist offen da Typargument (d. h. Base) ist eine generische Typdefinition. Dies veranschaulicht die rekursive Art von der IsGenericType Eigenschaft.

Die geschachtelte Klasse Nested

IsGenericType ist true, obwohl die Nested -Klasse verfügt über keine eigenen generischen Typparameter, weil sie in einem generischen Typ geschachtelt ist.

IsGenericTypeDefinition ist true. Sie können also Aufrufen der MakeGenericType -Methode und übergeben Sie den Typparameter des einschließenden Typs Derived.

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

Das folgende Codebeispiel zeigt den Wert von der IsGenericType, IsGenericTypeDefinition, IsGenericParameter, und ContainsGenericParameters Eigenschaften für die Typen, die im Abschnitt "Hinweise" beschrieben. Erläuterungen der Eigenschaftswerte finden Sie in der zugehörigen Tabelle unter "Hinweise".

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
Verfügbar seit 2.0
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Zurück zum Anfang
Anzeigen: