Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Propiedad Type.IsGenericType

 

Publicado: octubre de 2016

Obtiene un valor que indica si el tipo actual es genérico.

Espacio de nombres:   System
Ensamblado:  mscorlib (en mscorlib.dll)

public virtual bool IsGenericType { get; }

Valor de propiedad

Type: System.Boolean

true si el tipo actual es un tipo genérico; de lo contrario, false.

Use la IsGenericType propiedad para determinar si un Type objeto representa un tipo genérico. Use la ContainsGenericParameters propiedad para determinar si un Type objeto representa un tipo construido abierto o un tipo construido cerrado.

System_CAPS_noteNota

El IsGenericType propiedad devuelve false si el tipo inmediato no es genérico. Por ejemplo, una matriz cuyos elementos son de tipo A<int> (A(Of Integer) en Visual Basic) no es un tipo genérico.

En la tabla siguiente se resume las condiciones invariables para términos comunes utilizados en la reflexión genérica.

Término

Invariable

definición de tipo genérico

La propiedad IsGenericTypeDefinition es true.

Define un tipo genérico. Se crea un tipo construido mediante una llamada a la MakeGenericType método en un Type objeto que representa una definición de tipo genérico y especifica una matriz de argumentos de tipo.

MakeGenericTypepuede llamarse solo en definiciones de tipo genérico.

Cualquier definición de tipo genérico es un tipo genérico (la IsGenericType propiedad es true), pero la conversión no es verdadera.

tipo genérico

La propiedad IsGenericType es true.

Puede ser una definición de tipo genérico, un tipo construido abierto o un tipo construido cerrado.

Tenga en cuenta que un tipo de matriz cuyo tipo de elemento es genérico no es un tipo genérico. Lo mismo puede decirse de una Type objeto que representa un puntero a un tipo genérico.

tipo construido abierto

La propiedad ContainsGenericParameters es true.

Se trata de un tipo genérico que ha sin asignar parámetros de tipo, un tipo que está anidado en una definición de tipo genérico o en un tipo construido abierto o un tipo genérico que tiene un argumento de tipo para el que el ContainsGenericParameters propiedad es true.

No es posible crear una instancia de un tipo construido abierto.

Tenga en cuenta que no se podrá abrir todos los tipos construidos son genéricos. Por ejemplo, una matriz cuyo tipo de elemento es una definición de tipo genérico no es genérica, y un puntero a un tipo construido abierto no es genérico.

tipo construido cerrado

La propiedad ContainsGenericParameters es false.

Cuando examina de forma recursiva, el tipo no tiene sin asignar parámetros genéricos.

parámetro de tipo genérico

La propiedad IsGenericParameter es true.

La propiedad ContainsGenericParameters es true.

En una definición de tipo genérico, un marcador de posición para un tipo que se va a asignar más adelante.

argumento de tipo genérico

Puede ser cualquier tipo, incluido un parámetro de tipo genérico.

Argumentos de tipo se especifican como una matriz de Type los objetos pasan a la MakeGenericType método cuando se crea un tipo genérico construido. Si son instancias del tipo resultante que se creará, el ContainsGenericParameters propiedad debe ser false para todos los argumentos de tipo.

El ejemplo de código y la tabla siguientes muestran algunas de estas condiciones e invariables. La Derived clase resulta de especial interés porque su tipo base es un tipo construido que tiene una mezcla de tipos y parámetros de tipo en su lista de argumentos de 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> {}

La siguiente tabla muestra ejemplos que usan y basan en las clases de Base, Derived, y G. Cuando el código de C++ y C# es el mismo, se muestra sólo una entrada.

Ejemplo

Invariables

Derived(Of V)

Derived<V>

Para este tipo:

El valor de IsGenericType es true.

El valor de IsGenericTypeDefinition es true.

El valor de ContainsGenericParameters es true.

Base(Of String, V)

Base<String,V>

Base<String^,V>

Para este tipo:

El valor de IsGenericType es true.

El valor de IsGenericTypeDefinition es false.

El valor de ContainsGenericParameters es true.

Dim d() As Derived(Of Integer)

Derived<int>[] d;

array<Derived<int>^>^ d;

Para el tipo de variable d:

IsGenericType es false porque d es una matriz.

El valor de IsGenericTypeDefinition es false.

El valor de ContainsGenericParameters es false.

T, U, y V (everywhere aparecen)

El valor de IsGenericParameter es true.

IsGenericType es false porque no hay ninguna manera de restringir un parámetro de tipo para tipos genéricos.

El valor de IsGenericTypeDefinition es false.

ContainsGenericParameterses true porque T, U, y V son parámetros de tipo genérico. Esto no implica nada sobre los argumentos de tipo que se les asignan más adelante.

El tipo de campo F

El valor de IsGenericType es true.

IsGenericTypeDefinitiones false porque se ha asignado un tipo al parámetro de tipo de G. Tenga en cuenta que esto es equivalente a haber llamado a la MakeGenericType método.

ContainsGenericParameterses true porque el tipo de campo F tiene un argumento de tipo es un tipo construido abierto. El tipo construido es abierto porque su argumento de tipo (es decir, Base) es una definición de tipo genérico. Esto ilustra la naturaleza recursiva de la IsGenericType propiedad.

La clase anidadaNested

IsGenericType es true, incluso si la Nested clase no tiene ningún parámetro de tipo genérico propios, porque está anidada en un tipo genérico.

El valor de IsGenericTypeDefinition es true. Es decir, puede llamar a la MakeGenericType método y proporcione el parámetro de tipo del tipo envolvente, Derived.

ContainsGenericParameterses true porque incluye tipo, Derived, tiene parámetros de tipo genérico. Esto ilustra la naturaleza recursiva de la ContainsGenericParameters propiedad.

En el ejemplo de código siguiente se muestra el valor de la IsGenericType, IsGenericTypeDefinition, IsGenericParameter, y ContainsGenericParameters propiedades de los tipos descritos en la sección Comentarios. Para obtener una explicación de los valores de propiedad, vea la tabla que aparece en la sección Comentarios.

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
Disponible desde 2.0
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Volver al principio
Mostrar: