Questa documentazione è stata archiviata e non viene gestita.

Proprietà Type.IsGenericType

Aggiornamento: novembre 2007

Ottiene un valore che indica se il tipo corrente è un tipo generico.

Spazio dei nomi:  System
Assembly:  mscorlib (in mscorlib.dll)

public virtual bool IsGenericType { get; }
/** @property */
public boolean get_IsGenericType()

public function get IsGenericType () : boolean

Valore proprietà

Tipo: System.Boolean
true se il tipo corrente è un tipo generico. In caso contrario, false.

Utilizzare la proprietà IsGenericType per determinare se un oggetto Type rappresenta un tipo generico. Utilizzare la proprietà ContainsGenericParameters per determinare se un oggetto Type rappresenta un tipo costruito aperto o chiuso.

ms131514.alert_note(it-it,VS.90).gifNota:

La proprietà IsGenericType restituisce false se il tipo immediato non è generico. Una matrice i cui elementi sono di tipo A<int> (A(Of Integer) in Visual Basic), ad esempio, non è di per sé un tipo generico.

Nella tabella riportata di seguito viene fornito un riepilogo delle condizioni invarianti per i termini comuni utilizzati nella reflection generica.

Termine

Condizione invariante

definizione di tipo generico

La proprietà IsGenericTypeDefinition è true.

Definisce un tipo generico. Un tipo costruito viene creato chiamando il metodo MakeGenericType su un oggetto Type che rappresenta una definizione di tipo generico e specificando una matrice di argomenti di tipo.

MakeGenericType può essere chiamato soltanto su definizioni di tipo generico.

Qualsiasi definizione di tipo generico è un tipo generico (la proprietà IsGenericType è true), mentre non è vero il contrario.

tipo generico

La proprietà IsGenericType è true.

Può essere costituito da una definizione di tipo generico, un tipo costruito aperto o un tipo costruito chiuso.

Un tipo matrice il cui tipo di elemento è generico non è di per sé un tipo generico, così come un oggetto Type che rappresenta un puntatore a un tipo generico.

tipo costruito aperto

La proprietà ContainsGenericParameters è true.

Sono esempi di tipo costruito aperto un tipo generico con parametri di tipo non assegnati, un tipo nidificato in una definizione di tipo generico o in un tipo costruito aperto oppure un tipo generico con un argomento di tipo per cui la proprietà ContainsGenericParameters è true.

Non è possibile creare un'istanza di un tipo costruito aperto.

Non tutti i tipi costruiti aperti sono generici. Una matrice con elementi il cui tipo è una definizione di tipo generico non è ad esempio generica, così come non lo è un puntatore a un tipo costruito aperto.

tipo costruito chiuso

La proprietà ContainsGenericParameters è false.

Quando viene esaminato in modo ricorsivo, il tipo non dispone di parametri generici non assegnati,

parametro di tipo generico

La proprietà IsGenericParameter è true.

La proprietà ContainsGenericParameters è true.

In una definizione di tipo generico, segnaposto per un tipo che verrà assegnato successivamente.

argomento di tipo generico

Può corrispondere a qualsiasi tipo, incluso un parametro di tipo generico.

Gli argomenti di tipo vengono specificati come una matrice di oggetti Type passata al metodo MakeGenericType al momento della creazione di un tipo generico costruito. Se devono essere create istanze del tipo risultante, la proprietà ContainsGenericParameters deve essere false per tutti gli argomenti di tipo.

Nell'esempio di codice e nella tabella riportati di seguito vengono illustrati alcuni di questi termini e condizioni invarianti. La classe Derived riveste particolare interesse poiché il relativo tipo base è un tipo costruito che dispone di una combinazione di tipi e parametri di tipo nell'elenco di argomenti di tipo.

public class Base<T,U> {}
public class Derived<V> : Base<String,V> 
{
    public G<Derived<V>> F;
    public class Nested {}
}
public class G<T> {}

Nella tabella riportata di seguito vengono forniti esempi che utilizzano le classi Base, Derived e G e sono basati su di esse. Nei casi in cui il codice C++ e C# coincidono, viene illustrata una sola voce.

Esempio

Condizioni invarianti

Derived(Of V)

Derived<V>

Per questo tipo:

IsGenericTypeè true.

IsGenericTypeDefinition è true.

ContainsGenericParametersè true.

Base(Of String, V)

Base<String,V>

Base<String^,V>

Per questo tipo:

IsGenericTypeè true.

IsGenericTypeDefinitionè false.

ContainsGenericParametersè true.

Dim d() As Derived(Of Integer)

Derived<int>[] d;

array<Derived<int>^>^ d;

Per il tipo di variabile d:

IsGenericType è false poiché d è una matrice.

IsGenericTypeDefinitionè false.

ContainsGenericParameters è false.

T, U e V (in ogni occorrenza)

IsGenericParameter è true.

IsGenericType è false poiché non possibile vincolare un parametro di tipo a tipi generici.

IsGenericTypeDefinitionè false.

ContainsGenericParameters è true perché T, U e V sono a loro volta parametri di tipo generico. Ciò non implica alcunché sugli argomenti del tipo assegnati in un secondo momento.

Tipo di campo F

IsGenericTypeè true.

IsGenericTypeDefinition è false poiché è stato assegnato un tipo al parametro di tipo di G. Ciò equivale alla chiamata del metodo MakeGenericType.

ContainsGenericParameters è true poiché il tipo di campo F dispone di un argomento di tipo costituito da un tipo costruito aperto. Il tipo costruito è aperto poiché il relativo argomento di tipo (ovvero Base) è una definizione di tipo generico. Ciò illustra la natura ricorsiva della proprietà IsGenericType.

Classe nidificata Nested

IsGenericType è true, nonostante la classe Nested non disponga di parametri di tipo generico, poiché è nidificata in un tipo generico.

IsGenericTypeDefinition è true. È pertanto possibile chiamare il metodo MakeGenericType e fornire il parametro di tipo del tipo contenitore Derived.

ContainsGenericParameters è true poiché il tipo contenitore Derived dispone di parametri di tipo generico. Ciò illustra la natura ricorsiva della proprietà ContainsGenericParameters.

Nell'esempio di codice riportato di seguito viene visualizzato il valore delle proprietà IsGenericType, IsGenericTypeDefinition, IsGenericParameter e ContainsGenericParameters per i tipi descritti nella sezione relativa alle note. Per una spiegazione dei valori delle proprietà, vedere la tabella nelle note.

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


Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition , Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile per Smartphone, Windows Mobile per Pocket PC, Xbox 360

.NET Framework e .NET Compact Framework non supportano tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

.NET Framework

Supportato in: 3.5, 3.0, 2.0

.NET Compact Framework

Supportato in: 3.5, 2.0

XNA Framework

Supportato in: 2.0, 1.0
Mostra: