Type.IsGenericType Egenskap

Definition

Hämtar ett värde som anger om den aktuella typen är en allmän typ.

public:
 virtual property bool IsGenericType { bool get(); };
public virtual bool IsGenericType { get; }
member this.IsGenericType : bool
Public Overridable ReadOnly Property IsGenericType As Boolean

Egenskapsvärde

trueom den aktuella typen är en allmän typ; annars . false

Exempel

I följande kodexempel visas värdet IsGenericTypeför egenskaperna , IsGenericTypeDefinition, IsGenericParameteroch ContainsGenericParameters för de typer som beskrivs i avsnittet Kommentarer. Förklaringar av egenskapsvärdena finns i den medföljande tabellen i Kommentarer.

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
 */
open System

type Base<'T, 'U>() = class end

type G<'T>() = class end

type Derived<'V>() =
    inherit Base<string, 'V>()
    
    [<DefaultValue>]
    val mutable public F : G<Derived<'V>>

let displayGenericType (t: Type) caption =
    printfn $"\n{caption}"
    printfn $"    Type: {t}"

    printfn $"\t            IsGenericType: {t.IsGenericType}" 
    printfn $"\t  IsGenericTypeDefinition: {t.IsGenericTypeDefinition}" 
    printfn $"\tContainsGenericParameters: {t.ContainsGenericParameters}"
    printfn $"\t       IsGenericParameter: {t.IsGenericParameter}"

// Get the generic type definition for Derived, and the base
// type for Derived.
let tDerived = typeof<Derived<_>>.GetGenericTypeDefinition()
let tDerivedBase = tDerived.BaseType

// Declare an array of Derived<int>, and get its type.
let d = Array.zeroCreate<Derived<int>> 0
let 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.
let tT = typeof<Base<_,_>>.GetGenericTypeDefinition().GetGenericArguments()[0]
let tF = tDerived.GetField("F").FieldType

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>>"

(* 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
 *)
Imports System.Reflection

' 
Public Class Base(Of T, U)
End Class

Public Class Derived(Of V) 
    Inherits Base(Of String, V)

    Public F As G(Of Derived(Of V))

    Public Class Nested
    End Class
End Class

Public Class G(Of T)
End Class 

Module Example

    Sub Main

        ' Get the generic type definition for Derived, and the base
        ' type for Derived.
        '
        Dim tDerived As Type = GetType(Derived(Of ))
        Dim tDerivedBase As Type = tDerived.BaseType

        ' Declare an array of Derived(Of Integer), and get its type.
        '
        Dim d(0) As Derived(Of Integer)
        Dim tDerivedArray As Type = 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(Of ), as shown here,
        ' or (2) specify a type parameter for Derived.
        '
        Dim tT As Type = GetType(Base(Of ,)).GetGenericArguments()(0)
        Dim tF As Type = tDerived.GetField("F").FieldType
        Dim tNested As Type = GetType(Derived(Of ).Nested)

        DisplayGenericType(tDerived, "Derived(Of V)")
        DisplayGenericType(tDerivedBase, "Base type of Derived(Of V)")
        DisplayGenericType(tDerivedArray, "Array of Derived(Of Integer)")
        DisplayGenericType(tT, "Type parameter T from Base(Of T)")
        DisplayGenericType(tF, "Field type, G(Of Derived(Of V))")
        DisplayGenericType(tNested, "Nested type in Derived(Of V)")

    End Sub

    Sub DisplayGenericType(ByVal t As Type, ByVal caption As String)

        Console.WriteLine(vbLf & caption)
        Console.WriteLine("    Type: {0}", t)

        Console.WriteLine(vbTab & "            IsGenericType: {0}", _
            t.IsGenericType)
        Console.WriteLine(vbTab & "  IsGenericTypeDefinition: {0}", _
            t.IsGenericTypeDefinition)
        Console.WriteLine(vbTab & "ContainsGenericParameters: {0}", _
            t.ContainsGenericParameters)
        Console.WriteLine(vbTab & "       IsGenericParameter: {0}", _
            t.IsGenericParameter)

    End Sub

End Module

' This code example produces the following output:
'
'Derived(Of V)
'    Type: Derived`1[V]
'                    IsGenericType: True
'          IsGenericTypeDefinition: True
'        ContainsGenericParameters: True
'               IsGenericParameter: False
'
'Base type of Derived(Of V)
'    Type: Base`2[System.String,V]
'                    IsGenericType: True
'          IsGenericTypeDefinition: False
'        ContainsGenericParameters: True
'               IsGenericParameter: False
'
'Array of Derived(Of Integer)
'    Type: Derived`1[System.Int32][]
'                    IsGenericType: False
'          IsGenericTypeDefinition: False
'        ContainsGenericParameters: False
'               IsGenericParameter: False
'
'Type parameter T from Base(Of T)
'    Type: T
'                    IsGenericType: False
'          IsGenericTypeDefinition: False
'        ContainsGenericParameters: True
'               IsGenericParameter: True
'
'Field type, G(Of Derived(Of V))
'    Type: G`1[Derived`1[V]]
'                    IsGenericType: True
'          IsGenericTypeDefinition: False
'        ContainsGenericParameters: True
'               IsGenericParameter: False
'
'Nested type in Derived(Of V)
'    Type: Derived`1+Nested[V]
'                    IsGenericType: True
'          IsGenericTypeDefinition: True
'        ContainsGenericParameters: True
'               IsGenericParameter: False

Kommentarer

Använd egenskapen IsGenericType för att avgöra om ett Type objekt representerar en allmän typ. Använd egenskapen ContainsGenericParameters för att avgöra om ett Type objekt representerar en öppen konstruktionstyp eller en stängd konstruktionstyp.

Note

Egenskapen IsGenericType returnerar false om den omedelbara typen inte är generisk. Till exempel är en matris vars element är av typen A<int> (A(Of Integer) i Visual Basic) inte i sig en allmän typ.

I följande tabell sammanfattas de invarianta villkoren för vanliga termer som används i allmän reflektion.

Begrepp Invariant
generisk typdefinition Egenskapen IsGenericTypeDefinition är true.

Definierar en allmän typ. En konstruerad typ skapas genom att anropa MakeGenericType metoden för ett Type objekt som representerar en allmän typdefinition och ange en matris av typargument.

MakeGenericType kan anropas endast på generiska typdefinitioner.

Alla generiska typdefinitioner är en allmän typ (egenskapen IsGenericType är true), men converse är inte sant.
generisk typ Egenskapen IsGenericType är true.

Kan vara en allmän typdefinition, en öppen konstruktionstyp eller en sluten konstruktionstyp.

Observera att en matristyp vars elementtyp är generisk är inte i sig en allmän typ. Detsamma gäller för ett Type objekt som representerar en pekare till en allmän typ.
öppen konstruktionstyp Egenskapen ContainsGenericParameters är true.

Exempel är en allmän typ som har parametrar av otilldelad typ, en typ som är kapslad i en allmän typdefinition eller i en öppen konstruktionstyp eller en allmän typ som har ett typargument som ContainsGenericParameters egenskapen är trueför .

Det går inte att skapa en instans av en öppen konstruktionstyp.

Observera att inte alla öppna konstruktionstyper är generiska. En matris vars elementtyp är en allmän typdefinition är till exempel inte generisk och en pekare till en öppen konstruktionstyp är inte generisk.
sluten konstruktionstyp Egenskapen ContainsGenericParameters är false.

När den granskas rekursivt har typen inga otilldelade generiska parametrar.
generisk typparameter Egenskapen IsGenericParameter är true.

Egenskapen ContainsGenericParameters är true.

I en allmän typdefinition, en platshållare för en typ som kommer att tilldelas senare.
argument av generisk typ Kan vara vilken typ som helst, inklusive en allmän typparameter.

Typargument anges som en matris med Type objekt som skickas till MakeGenericType metoden när du skapar en konstruerad allmän typ. Om instanser av den resulterande typen ska skapas ContainsGenericParameters måste egenskapen vara false för alla typargument.

Följande kodexempel och tabell illustrerar några av dessa termer och invarianter. Klassen Derived är särskilt intressant eftersom dess bastyp är en konstruerad typ som har en blandning av typer och typparametrar i sin typargumentlista.

public class Base<T, U> {}

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

    public class Nested {}
}

public class G<T> {}
type Base<'T, 'U>() = class end

type G<'T>() = class end

type Derived<'V>() =
    inherit Base<string, 'V>()
    
    [<DefaultValue>]
    val mutable public F : G<Derived<'V>>
Public Class Base(Of T, U)
End Class

Public Class Derived(Of V)
    Inherits Base(Of String, V)

    Public F As G(Of Derived(Of V))

    Public Class Nested
    End Class
End Class

Public Class G(Of T)
End Class

I följande tabell visas exempel som använder och bygger på klasserna Base, Derivedoch G. När C++ och C#-koden är samma visas bara en post.

Example Invarianter
Derived(Of V)

Derived<V>
För den här typen:

IsGenericType är true.

IsGenericTypeDefinition är true.

ContainsGenericParameters är true.
Base(Of String, V)

Base<String,V>

Base<String^,V>
För den här typen:

IsGenericType är true.

IsGenericTypeDefinition är false.

ContainsGenericParameters är true.
Dim d() As Derived(Of Integer)

Derived<int>[] d;

array<Derived<int>^>^ d;
För typen av variabel d:

IsGenericType beror false på att d är en matris.

IsGenericTypeDefinition är false.

ContainsGenericParameters är false.
T, Uoch V (överallt de visas) IsGenericParameter är true.

IsGenericType beror false på att det inte finns något sätt att begränsa en typparameter till generiska typer.

IsGenericTypeDefinition är false.

ContainsGenericParameters beror true på att T, Uoch V själva är generiska typparametrar. Detta innebär inte något om typargument som tilldelas dem senare.
Typ av fält F IsGenericType är true.

IsGenericTypeDefinition beror false på att en typ har tilldelats till typparametern Gför . Observera att detta motsvarar att ha anropat MakeGenericType metoden.

ContainsGenericParameters beror true på att typen av fält F har ett typargument som är en öppen konstruktionstyp. Den konstruerade typen är öppen eftersom dess typargument (dvs. Base) är en allmän typdefinition. Detta illustrerar egenskapens rekursiva karaktär IsGenericType .
Den kapslade klassen Nested IsGenericType är true, även om Nested klassen inte har några egna generiska typparametrar, eftersom den är kapslad i en allmän typ.

IsGenericTypeDefinition är true. Det vill säga, du kan anropa MakeGenericType metoden och ange typparametern för den omslutande typen, Derived.

ContainsGenericParameters beror true på att omslutningstypen , Derivedhar allmänna typparametrar. Detta illustrerar egenskapens rekursiva karaktär ContainsGenericParameters .

Gäller för

Se även