Type.IsGenericType Type.IsGenericType Type.IsGenericType Type.IsGenericType Property

Определение

Возвращает значение, указывающее, является ли текущий тип универсальным.Gets a value indicating whether the current type is a generic type.

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

Значение свойства

trueзначение, если текущий тип является универсальным типом; в противном случае —. falsetrue if the current type is a generic type; otherwise, false.

Примеры

В следующем примере кода IsGenericTypeотображаются значения свойств,, IsGenericParameterи IsGenericTypeDefinition ContainsGenericParameters для типов, описанных в разделе "Примечания".The following code example displays the value of the IsGenericType, IsGenericTypeDefinition, IsGenericParameter, and ContainsGenericParameters properties for the types described in the Remarks section. Пояснения значений свойств см. в сопроводительной таблице в разделе "Примечания".For explanations of the property values, see the accompanying table in Remarks.

using namespace System;
using namespace System::Reflection;

generic<typename T, typename U> public ref class Base {};

generic<typename T> public ref class G {};

generic<typename V> public ref class Derived : Base<String^, V>
{
public: 
    G<Derived<V>^>^ F;

    ref class Nested {};
};

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);
}

void main()
{
    // Get the generic type definition for Derived, and the base
    // type for Derived.
    //
    Type^ tDerived = Derived::typeid;
    Type^ tDerivedBase = tDerived->BaseType;

    // Declare an array of Derived<int>, and get its type.
    //
    array<Derived<int>^>^ d = gcnew array<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::typeid, as shown here,
    // or (2) specify a type parameter for Derived.
    //
    Type^ tT = Base::typeid->GetGenericArguments()[0];
    Type^ tF = tDerived->GetField("F")->FieldType;
    Type^ tNested = Derived::Nested::typeid;

    DisplayGenericType(tDerived, "generic<V> Derived");
    DisplayGenericType(tDerivedBase, "Base type of generic<V> Derived");
    DisplayGenericType(tDerivedArray, "Array of Derived<int>");
    DisplayGenericType(tT, "Type parameter T from generic<T> Base");
    DisplayGenericType(tF, "Field type, G<Derived<V>^>^");
    DisplayGenericType(tNested, "Nested type in generic<V> Derived");
}

/* This code example produces the following output:

generic<V> Derived
    Type: Derived`1[V]
                    IsGenericType: True
          IsGenericTypeDefinition: True
        ContainsGenericParameters: True
               IsGenericParameter: False

Base type of generic<V> Derived
    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 generic<T> Base
    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 generic<V> Derived
    Type: Derived`1+Nested[V]
                    IsGenericType: True
          IsGenericTypeDefinition: True
        ContainsGenericParameters: True
               IsGenericParameter: False
 */
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
 */
Imports System
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

Комментарии

Используйте свойство IsGenericType , чтобы определить, представляет Type ли объект универсальный тип.Use the IsGenericType property to determine whether a Type object represents a generic type. Используйте свойство ContainsGenericParameters , чтобы определить, представляет Type ли объект открытый сконструированный тип или закрытый сконструированный тип.Use the ContainsGenericParameters property to determine whether a Type object represents an open constructed type or a closed constructed type.

Примечание

IsGenericType Свойство возвращаетfalse значение, если немедленный тип не является универсальным.The IsGenericType property returns false if the immediate type is not generic. Например, массив, элементы которого имеют тип A<int> (A(Of Integer) в Visual Basic), не является универсальным типом.For example, an array whose elements are of type A<int> (A(Of Integer) in Visual Basic) is not itself a generic type.

В следующей таблице перечислены инвариантные условия для общих терминов, используемых в универсальном отражении.The following table summarizes the invariant conditions for common terms used in generic reflection.

ТерминTerm ИнвариантInvariant
определение универсального типаgeneric type definition Значение свойства IsGenericTypeDefinitiontrue.The IsGenericTypeDefinition property is true.

Определяет универсальный тип.Defines a generic type. Сконструированный тип создается путем вызова MakeGenericType метода Type для объекта, который представляет определение универсального типа и указания массива аргументов типа.A constructed type is created by calling the MakeGenericType method on a Type object that represents a generic type definition and specifying an array of type arguments.

MakeGenericTypeможет вызываться только для определений универсальных типов.MakeGenericType can be called only on generic type definitions.

Любое определение универсального типа является универсальным типом ( IsGenericType свойство — true), а обратное — нет.Any generic type definition is a generic type (the IsGenericType property is true), but the converse is not true.
универсальный типgeneric type Значение свойства IsGenericTypetrue.The IsGenericType property is true.

Может быть определением универсального типа, открытым сконструированным типом или закрытым сконструированным типом.Can be a generic type definition, an open constructed type, or a closed constructed type.

Обратите внимание, что тип массива, элемент которого является универсальным, сам по себе не является универсальным типом.Note that an array type whose element type is generic is not itself a generic type. То же самое справедливо для Type объекта, представляющего указатель на универсальный тип.The same is true of a Type object representing a pointer to a generic type.
открытый сконструированный типopen constructed type Значение свойства ContainsGenericParameterstrue.The ContainsGenericParameters property is true.

Примеры — это универсальный тип, который имеет неназначенные параметры типа, тип, вложенный в определение универсального типа или в открытый сконструированный тип, или универсальный тип с аргументом типа, для которого ContainsGenericParameters свойство имеет trueзначение.Examples are a generic type that has unassigned type parameters, a type that is nested in a generic type definition or in an open constructed type, or a generic type that has a type argument for which the ContainsGenericParameters property is true.

Невозможно создать экземпляр открытого сконструированного типа.It is not possible to create an instance of an open constructed type.

Обратите внимание, что не все открытые сконструированные типы являются универсальными.Note that not all open constructed types are generic. Например, массив, тип элемента которого является определением универсального типа, не является универсальным, а указатель на открытый сконструированный тип не является универсальным.For example, an array whose element type is a generic type definition is not generic, and a pointer to an open constructed type is not generic.
закрытый сконструированный типclosed constructed type Значение свойства ContainsGenericParametersfalse.The ContainsGenericParameters property is false.

При рекурсивном исследовании тип не имеет неназначенных универсальных параметров.When examined recursively, the type has no unassigned generic parameters.
параметр универсального типаgeneric type parameter Значение свойства IsGenericParametertrue.The IsGenericParameter property is true.

Значение свойства ContainsGenericParameterstrue.The ContainsGenericParameters property is true.

В определении универсального типа заполнитель для типа, который будет назначен позже.In a generic type definition, a placeholder for a type that will be assigned later.
аргумент универсального типаgeneric type argument Может быть любым типом, включая параметр универсального типа.Can be any type, including a generic type parameter.

Аргументы типа указываются в виде массива Type объектов, передаваемых MakeGenericType в метод при создании сконструированного универсального типа.Type arguments are specified as an array of Type objects passed to the MakeGenericType method when creating a constructed generic type. Если создаются экземпляры результирующего типа, ContainsGenericParameters свойство должно иметь false значение для всех аргументов типа.If instances of the resulting type are to be created, the ContainsGenericParameters property must be false for all the type arguments.

В следующем примере кода и таблице показаны некоторые из этих терминов и инвариантов.The following code example and table illustrate some of these terms and invariants. Этот Derived класс является особым интересом, так как его базовый тип является сконструированным типом, который имеет смесь типов и параметров типа в списке аргументов типа.The Derived class is of particular interest because its base type is a constructed type that has a mixture of types and type parameters in its type argument list.

generic<typename T, typename U> public ref class Base {};

generic<typename T> public ref class G {};

generic<typename V> public ref class Derived : Base<String^, V>
{
public:
    G<Derived<V>^>^ F;

    ref class Nested {};
};
public class Base<T, U> {}

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

    public class Nested {}
}

public class G<T> {}
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

В следующей таблице приведены примеры использования и построения классов Base, Derivedи G.The following table shows examples that use and build on the classes Base, Derived, and G. Если код C++ и C# совпадает, отображается только одна запись.When the C++ and C# code is the same, only one entry is shown.

ПримерExample ИнвариантыInvariants
Derived(Of V)

Derived<V>
Для этого типа:For this type:

IsGenericTypetrue.IsGenericType is true.

IsGenericTypeDefinitiontrue.IsGenericTypeDefinition is true.

Свойство ContainsGenericParameters имеет значение true.ContainsGenericParameters is true.
Base(Of String, V)

Base<String,V>

Base<String^,V>
Для этого типа:For this type:

IsGenericTypetrue.IsGenericType is true.

Свойство IsGenericTypeDefinition имеет значение false.IsGenericTypeDefinition is false.

ContainsGenericParameterstrue.ContainsGenericParameters is true.
Dim d() As Derived(Of Integer)

Derived<int>[] d;

array<Derived<int>^>^ d;
Для типа переменной d:For the type of variable d:

IsGenericTypeимеет false , d потому что является массивом.IsGenericType is false because d is an array.

Свойство IsGenericTypeDefinition имеет значение false.IsGenericTypeDefinition is false.

Свойство ContainsGenericParameters имеет значение false.ContainsGenericParameters is false.
T, U иV (где бы они ни находились)T, U, and V (everywhere they appear) Свойство IsGenericParameter имеет значение true.IsGenericParameter is true.

IsGenericTypeимеет false значение, поскольку невозможно ограничить параметр типа универсальными типами.IsGenericType is false because there is no way to constrain a type parameter to generic types.

Свойство IsGenericTypeDefinition имеет значение false.IsGenericTypeDefinition is false.

ContainsGenericParameterstrue посколькуU, и являютсяV параметрами универсального типа. TContainsGenericParameters is true because T, U, and V are themselves generic type parameters. Это не подразумевает никаких действий с аргументами типа, назначенными им позже.This does not imply anything about type arguments that are assigned to them later.
Тип поляFThe type of field F Свойство IsGenericType имеет значение true.IsGenericType is true.

IsGenericTypeDefinitionимеет false значение, так как тип был назначен Gпараметру-типу.IsGenericTypeDefinition is false because a type has been assigned to the type parameter of G. Обратите внимание, что это эквивалентно вызову MakeGenericType метода.Note that this is equivalent to having called the MakeGenericType method.

ContainsGenericParametersимеет true значение, поскольку тип поля F имеет аргумент типа, который является открытым сконструированным типом.ContainsGenericParameters is true because the type of field F has a type argument that is an open constructed type. Сконструированный тип открыт, так как его аргумент типа (то есть Base) является определением универсального типа.The constructed type is open because its type argument (that is, Base) is a generic type definition. Это иллюстрирует рекурсивную природу IsGenericType свойства.This illustrates the recursive nature of the IsGenericType property.
Вложенный классNestedThe nested class Nested IsGenericTypeимеет trueзначение, Nested несмотря на то, что класс не имеет собственных параметров универсального типа, так как он вложен в универсальный тип.IsGenericType is true, even though the Nested class has no generic type parameters of its own, because it is nested in a generic type.

IsGenericTypeDefinitiontrue.IsGenericTypeDefinition is true. То есть можно вызвать MakeGenericType метод и указать параметр типа включающего типа,. DerivedThat is, you can call the MakeGenericType method and supply the type parameter of the enclosing type, Derived.

ContainsGenericParametersимеет true значение, поскольку включающий тип Derived, имеет параметры универсального типа.ContainsGenericParameters is true because the enclosing type, Derived, has generic type parameters. Это иллюстрирует рекурсивную природу ContainsGenericParameters свойства.This illustrates the recursive nature of the ContainsGenericParameters property.

Применяется к

Дополнительно