此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Type.GetGenericTypeDefinition 方法

2013/12/13

返回一个表示可用于构造当前泛型类型的泛型类型定义的 Type 对象。

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

public virtual Type GetGenericTypeDefinition()

返回值

类型: System.Type
表示可用于构造当前类型的泛型类型的 Type 对象。

异常条件
InvalidOperationException

当前对象不是泛型类型。即 IsGenericType 返回 false

NotSupportedException

基类不支持所调用的方法。派生类必须提供实现。

泛型类型定义是可用于构造其他类型的模板。例如,可使用泛型类型定义 G<T>(以 C# 语法表示;在 Visual Basic 中为 G(Of T);在 C++ 中为 generic <typename T> ref class G)构造和初始化类型 G<int>(在 Visual Basic 中为 G(Of Integer))。给定一个表示此构造类型的 Type 对象,GetGenericTypeDefinition 方法将返回泛型类型定义。

如果使用相同的类型实参从相同的泛型类型定义创建两个构造类型,GetGenericTypeDefinition 方法对两个类型都返回相同的 Type 对象。

如果调用已经表示泛型类型定义的 Type 对象的 GetGenericTypeDefinition 方法,它将返回当前的 Type

重要说明重要说明:

泛型类型的数组本身不是泛型。在 C# 代码 A<int>[] v; 或在 Visual Basic 代码 Dim v() As A(Of Integer) 中,变量 v 的类型不是泛型。在调用 GetGenericTypeDefinition 之前,应使用 IsGenericType 来确定某个类型是否为泛型。

有关泛型反射中使用的术语的固定条件列表,请参见 IsGenericType 属性备注。

下面的代码示例通过使用普通的实例创建来创建构造类型的实例,然后使用 GetTypeGetGenericTypeDefinition 方法检索构造类型和泛型类型定义。此示例使用泛型 Dictionary<TKey, TValue> 类型;构造类型表示具有字符串键的 Test 对象的 Dictionary<TKey, TValue>

说明注意:

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


using System;
using System.Reflection;
using System.Collections.Generic;

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      outputBlock.Text += "\r\n--- Get the generic type that defines a constructed type." + "\n";

      // Create a Dictionary of Example objects, using strings for the
      // keys.       
      Dictionary<string, Example> d = new Dictionary<string, Example>();

      // Get a Type object representing the constructed type.
      //
      Type constructed = d.GetType();
      DisplayTypeInfo(outputBlock, constructed);

      Type generic = constructed.GetGenericTypeDefinition();
      DisplayTypeInfo(outputBlock, generic);
   }

   private static void DisplayTypeInfo(System.Windows.Controls.TextBlock outputBlock, Type t)
   {
      outputBlock.Text += String.Format("\r\n{0}", t) + "\n";
      outputBlock.Text += String.Format("\tIs this a generic type definition? {0}",
          t.IsGenericTypeDefinition) + "\n";
      outputBlock.Text += String.Format("\tIs it a generic type? {0}",
          t.IsGenericType) + "\n";
      Type[] typeArguments = t.GetGenericArguments();
      outputBlock.Text += String.Format("\tList type arguments ({0}):", typeArguments.Length) + "\n";
      foreach (Type tParam in typeArguments)
      {
         outputBlock.Text += String.Format("\t\t{0}", tParam) + "\n";
      }
   }
}

/* This example produces the following output:

--- Get the generic type that defines a constructed type.

System.Collections.Generic.Dictionary`2[System.String,Test]
        Is this a generic type definition? False
        Is it a generic type? True
        List type arguments (2):
                System.String
                Test

System.Collections.Generic.Dictionary`2[TKey,TValue]
        Is this a generic type definition? True
        Is it a generic type? True
        List type arguments (2):
                TKey
                TValue
 */


Windows Phone OS

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

Windows Phone

Microsoft 正在进行一项网上调查,以了解您对 MSDN 网站的意见。 如果您选择参加,我们将会在您离开 MSDN 网站时向您显示该网上调查。

是否要参加?
显示:
© 2015 Microsoft