Type.IsGenericType 属性   
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取一个值,该值指示当前类型是否是泛型类型。
public:
 virtual property bool IsGenericType { bool get(); };public virtual bool IsGenericType { get; }member this.IsGenericType : boolPublic Overridable ReadOnly Property IsGenericType As Boolean属性值
              true 如果当前类型是泛型类型,则为 ;否则为 false。
示例
下面的代码示例显示备注部分所述的类型的 、IsGenericTypeDefinition、 IsGenericParameter和 ContainsGenericParameters 属性的值IsGenericType。 有关属性值的说明,请参阅备注中随附的表。
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
 */
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
注解
IsGenericType使用 属性确定 对象是否Type表示泛型类型。 ContainsGenericParameters使用 属性可以确定 对象是表示打开的构造类型还是Type封闭的构造类型。
注意
如果直接类型不是泛型,则 IsGenericType 属性返回 false 。 例如,其元素在 Visual Basic) 中属于 (A(Of Integer) 类型的A<int>数组本身不是泛型类型。
下表总结了泛型反射中使用的常用术语的固定条件。
| 术语 | 固定条件 | 
|---|---|
| Generic Type Definition — 泛型类型定义 | IsGenericTypeDefinition 属性为 true。定义泛型类型。 构造类型是通过对表示泛型类型定义的 对象调用 MakeGenericType 方法 Type 并指定类型参数数组来创建的。 MakeGenericType 只能在泛型类型定义上调用。 任何泛型类型定义都是泛型类型, IsGenericType (属性) true,但反之则不成立。 | 
| Generic Type — 泛型类型 | IsGenericType 属性为 true。可以是泛型类型定义、开放构造类型或封闭构造类型。 请注意,元素类型为泛型的数组类型本身不是泛型类型。 表示指向泛型类型的指针的 对象也是如此 Type 。 | 
| open 构造类型 | ContainsGenericParameters 属性为 true。示例包括具有未分配的类型参数的泛型类型、嵌套在泛型类型定义或开放式构造类型中的类型,或具有属性为 的类型 ContainsGenericParameters 参数的 true泛型类型。无法创建开放式构造类型的实例。 请注意,并非所有打开的构造类型都是泛型的。 例如,其元素类型为泛型类型定义的数组不是泛型,指向打开的构造类型的指针不是泛型。 | 
| 闭合构造类型 | ContainsGenericParameters 属性为 false。以递归方式检查时,类型没有未分配的泛型参数。 | 
| Generic Type Parameter — 泛型类型参数 | IsGenericParameter 属性为 true。ContainsGenericParameters 属性为 true。在泛型类型定义中,为稍后将分配的类型占位符。 | 
| Generic Type Argument — 泛型类型变量 | 可以是任何类型,包括泛型类型参数。 类型参数指定为在创建构造泛 Type 型类型时传递给 MakeGenericType 方法的对象数组。 如果要创建生成的类型的实例,则 ContainsGenericParameters 所有类型参数的 属性都必须 false为 。 | 
下面的代码示例和表演示了其中一些术语和固定项。 类 Derived 特别值得关注,因为它的基类型是一个构造类型,其类型参数列表中具有类型和类型参数的混合。
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> {}
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
下表显示了使用 和 基于类 Base、 Derived和 G构建的示例。 当 C++ 和 C# 代码相同时,仅显示一个条目。
| 示例 | 固定协定 | 
|---|---|
| Derived(Of V)Derived<V> | 对于此类型: IsGenericType 为 true。IsGenericTypeDefinition 为 true。ContainsGenericParameters 为 true。 | 
| Base(Of String, V)Base<String,V>Base<String^,V> | 对于此类型: IsGenericType 为 true。IsGenericTypeDefinition 为 false。ContainsGenericParameters 为 true。 | 
| Dim d() As Derived(Of Integer)Derived<int>[] d;array<Derived<int>^>^ d; | 对于变量 d的类型:IsGenericType 是因为 falsed是数组。IsGenericTypeDefinition 为 false。ContainsGenericParameters 为 false。 | 
| T、U和V(出现在任何位置) | IsGenericParameter 为 true。IsGenericType 这是因为 false无法将类型参数限制为泛型类型。IsGenericTypeDefinition 为 false。ContainsGenericParameters 是因为 trueT、U和V本身是泛型类型参数。 这并不表示有关稍后分配给它们的类型参数的任何内容。 | 
| 字段的类型 F | IsGenericType 为 true。IsGenericTypeDefinition 是因为 false类型已分配给 的类型G参数。 请注意,这等效于调用 MakeGenericType 方法。ContainsGenericParameters 这是因为 true字段F的类型具有一个类型参数,该类型参数是一个打开的构造类型。 构造的类型是打开的,因为它的类型参数 (即Base,) 是泛型类型定义。 这说明了 属性的 IsGenericType 递归性质。 | 
| 嵌套类 Nested | IsGenericType 为 true,尽管Nested类没有自己的泛型类型参数,因为它嵌套在泛型类型中。IsGenericTypeDefinition 为 true。 也就是说,可以调用 MakeGenericType 方法并提供封闭类型Derived的类型参数 。ContainsGenericParameters 这是因为 true封闭类型Derived具有泛型类型参数。 这说明了 属性的 ContainsGenericParameters 递归性质。 |