信息
您所需的主题如下所示。但此主题未包含在此库中。

Type.IsGenericType 属性

2013/12/13

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

Namespace:  System
程序集:  mscorlib(位于 mscorlib.dll 中)

public virtual bool IsGenericType { get; }

属性值

类型: System.Boolean
如果当前类型是泛型类型,则为 true;否则为 false

使用 IsGenericType 属性来确定 Type 对象是否表示泛型类型。使用 ContainsGenericParameters 属性来确定某个 Type 对象是表示开放构造的类型还是封闭构造的类型。

说明注意:

如果直接类型不是泛型,则 IsGenericType 属性将返回 false。例如,元素为 A<int> 类型(在 Visual Basic 中为 A(Of Integer))的数组本身不是泛型类型。

下表总结了泛型反射中使用的常见术语的固定条件。

术语

固定条件

Generic Type Definition — 泛型类型定义

IsGenericTypeDefinition 属性为 true

定义泛型类型。构造类型的创建方式是:调用表示泛型类型定义的 Type 对象的 MakeGenericType 方法,并指定类型参数数组。

只能在泛型类型定义上调用 MakeGenericType

任何泛型类型定义都是泛型类型(IsGenericType 属性为 true),但反过来则不成立。

Generic Type — 泛型类型

IsGenericType 属性为 true

可以是泛型类型定义、开封构造类型或封闭构造类型。

注意,元素类型为泛型的数组类型本身并不是泛型类型。表示指向泛型类型的指针的 Type 对象同样也不是泛型类型。

开放构造类型

ContainsGenericParameters 属性为 true

示例有:具有未分配类型参数的泛型类型、嵌套在泛型类型定义或开放构造类型中的类型,或具有类型变量的泛型类型(ContainsGenericParameters 属性为 true)。

不能创建开放构造类型的实例。

注意,并非所有开放构造类型都是泛型。例如,元素类型为泛型类型定义的数组并不是泛型,指向开放构造类型的指针也不是泛型。

封闭构造类型

ContainsGenericParameters 属性为 false

当递归进行检查时,该类型没有未赋值的泛型参数。

Generic Type Parameter — 泛型类型参数

IsGenericParameter 属性为 true

ContainsGenericParameters 属性为 true

在泛型类型定义中,指将在以后赋值的类型的占位符。

Generic Type Argument — 泛型类型变量

可以是任何类型,包括泛型类型形参。

类型实参是在创建构造泛型类型时作为传递给 MakeGenericType 方法的 Type 对象的数组来指定的。如果要创建所产生的类型的实例,所有类型实参的 ContainsGenericParameters 属性都必须为 false

下面的代码示例和表格阐释了其中的一些术语和常量。Derived 类特别重要,因为其基类型是类型参数列表中同时具有类型和类型参数的构造类型。

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 的类型:

IsGenericTypefalse,因为 d 是一个数组。

IsGenericTypeDefinitionfalse

ContainsGenericParametersfalse

TUV(不管它们出现在何处)

IsGenericParametertrue

IsGenericTypefalse,因为没有办法将类型形参约束为泛型类型。

IsGenericTypeDefinitionfalse

ContainsGenericParameterstrue,因为 TUV 本身是泛型类型形参。这并不意味着稍后分配到这些形参的类型实参的任何相关信息。

字段 F 的类型

IsGenericTypetrue

IsGenericTypeDefinitionfalse,因为已经向 G 的类型形参赋予了类型。注意,这等效于调用了 MakeGenericType 方法。

ContainsGenericParameterstrue,因为字段 F 的类型具有一个属于开放构造类型的类型实参。该构造类型是开放的,因为其类型实参(也就是 Base)是一个泛型类型定义。这一点说明了 IsGenericType 属性的递归本质。

嵌套类 Nested

IsGenericTypetrue,虽然 Nested 类没有它自己的泛型类型参数,因为它嵌套在一个泛型类型中。

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

ContainsGenericParameterstrue,因为封闭类型 Derived 具有泛型类型参数。这一点说明了 ContainsGenericParameters 属性的递归本质。

下面的代码示例显示了“备注”一节所述的类型的 IsGenericTypeIsGenericTypeDefinitionIsGenericParameterContainsGenericParameters 属性的值。有关属性值的解释,请参见“备注”中的附表。

说明注意:

要运行此示例,请参见生成具有静态 Windows Phone TextBlock 控件的示例


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 Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      // 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(outputBlock, tDerived, "Derived<V>");
      DisplayGenericType(outputBlock, tDerivedBase, "Base type of Derived<V>");
      DisplayGenericType(outputBlock, tDerivedArray, "Array of Derived<int>");
      DisplayGenericType(outputBlock, tT, "Type parameter T from Base<T>");
      DisplayGenericType(outputBlock, tF, "Field type, G<Derived<V>>");
      DisplayGenericType(outputBlock, tNested, "Nested type in Derived<V>");
   }

   public static void DisplayGenericType(System.Windows.Controls.TextBlock outputBlock, Type t, string caption)
   {
      outputBlock.Text += String.Format("\n{0}", caption) + "\n";
      outputBlock.Text += String.Format("    Type: {0}", t) + "\n";

      outputBlock.Text += String.Format("\t            IsGenericType: {0}",
          t.IsGenericType) + "\n";
      outputBlock.Text += String.Format("\t  IsGenericTypeDefinition: {0}",
          t.IsGenericTypeDefinition) + "\n";
      outputBlock.Text += String.Format("\tContainsGenericParameters: {0}",
          t.ContainsGenericParameters) + "\n";
      outputBlock.Text += String.Format("\t       IsGenericParameter: {0}",
          t.IsGenericParameter) + "\n";
   }
}

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

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

显示: