Type.IsGenericType 属性

定义

获取一个值,该值指示当前类型是否是泛型类型。

C#
public virtual bool IsGenericType { get; }

属性值

true 如果当前类型是泛型类型,则为 ;否则为 false

示例

下面的代码示例显示备注部分所述的类型的 、IsGenericTypeDefinitionIsGenericParameterContainsGenericParameters 属性的值IsGenericType。 有关属性值的说明,请参阅备注中随附的表。

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

注解

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 特别值得关注,因为它的基类型是一个构造类型,其类型参数列表中具有类型和类型参数的混合。

C#
public class Base<T, U> {}

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

    public class Nested {}
}

public class G<T> {}

下表显示了使用 和 基于类 BaseDerivedG构建的示例。 当 C++ 和 C# 代码相同时,仅显示一个条目。

示例 固定协定
Derived(Of V)

Derived<V>
对于此类型:

IsGenericTypetrue

IsGenericTypeDefinitiontrue

ContainsGenericParameterstrue
Base(Of String, V)

Base<String,V>

Base<String^,V>
对于此类型:

IsGenericTypetrue

IsGenericTypeDefinitionfalse

ContainsGenericParameterstrue
Dim d() As Derived(Of Integer)

Derived<int>[] d;

array<Derived<int>^>^ d;
对于变量 d的类型:

IsGenericType 是因为 falsed 是数组。

IsGenericTypeDefinitionfalse

ContainsGenericParametersfalse
TUV (出现在任何位置) IsGenericParametertrue

IsGenericType 这是因为 false 无法将类型参数限制为泛型类型。

IsGenericTypeDefinitionfalse

ContainsGenericParameters 是因为 trueTUV 本身是泛型类型参数。 这并不表示有关稍后分配给它们的类型参数的任何内容。
字段的类型 F IsGenericTypetrue

IsGenericTypeDefinition 是因为 false 类型已分配给 的类型 G参数。 请注意,这等效于调用 MakeGenericType 方法。

ContainsGenericParameters 这是因为 true 字段 F 的类型具有一个类型参数,该类型参数是一个打开的构造类型。 构造的类型是打开的,因为它的类型参数 (即 Base ,) 是泛型类型定义。 这说明了 属性的 IsGenericType 递归性质。
嵌套类 Nested IsGenericTypetrue,尽管 Nested 类没有自己的泛型类型参数,因为它嵌套在泛型类型中。

IsGenericTypeDefinitiontrue。 也就是说,可以调用 MakeGenericType 方法并提供封闭类型 Derived的类型参数 。

ContainsGenericParameters 这是因为 true 封闭类型 Derived具有泛型类型参数。 这说明了 属性的 ContainsGenericParameters 递归性质。

适用于

产品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

另请参阅