Type.IsGenericTypeDefinition 属性    
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取一个值,该值指示当前 Type 是否表示可以用来构造其他泛型类型的泛型类型定义。
public:
 virtual property bool IsGenericTypeDefinition { bool get(); };public virtual bool IsGenericTypeDefinition { get; }member this.IsGenericTypeDefinition : boolPublic Overridable ReadOnly Property IsGenericTypeDefinition As Boolean属性值
如果此 true 对象表示泛型类型定义,则为 Type;否则为 false。
示例
以下示例显示有关类型的信息,包括它是否为泛型类型定义。 为构造类型、泛型类型定义和普通类型显示信息。
using namespace System;
using namespace System::Reflection;
using namespace System::Collections::Generic;
public ref class Test
{
private:
   static void DisplayGenericTypeInfo( Type^ t )
   {
      Console::WriteLine( L"\r\n{0}", t );
      Console::WriteLine( L"\tIs this a generic type definition? {0}",
         t->IsGenericTypeDefinition );
      Console::WriteLine( L"\tIs it a generic type? {0}",
         t->IsGenericType );
      
      if ( t->IsGenericType )
      {
         
         // If this is a generic type, display the type arguments.
         //
         array<Type^>^typeArguments = t->GetGenericArguments();
         Console::WriteLine( L"\tList type arguments ({0}):",
            typeArguments->Length );
         System::Collections::IEnumerator^ myEnum =
            typeArguments->GetEnumerator();
         while ( myEnum->MoveNext() )
         {
            Type^ tParam = safe_cast<Type^>(myEnum->Current);
            
            // If this is a type parameter, display its
            // position.
            //
            if ( tParam->IsGenericParameter )
            {
               Console::WriteLine(
                  L"\t\t{0}\t(unassigned - parameter position {1})",
                  tParam, tParam->GenericParameterPosition );
            }
            else
            {
               Console::WriteLine( L"\t\t{0}", tParam );
            }
         }
      }
   }
public:
   static void Main()
   {
      Console::Write( L"\r\n--- Display information about a " );
      Console::WriteLine( L"constructed type, its" );
      Console::WriteLine( L"    generic type definition, and an ordinary type." );
      
      // Create a Dictionary of Test objects, using strings for the
      // keys.
      Dictionary< String^,Test^ >^ d = gcnew Dictionary< String^,Test^ >;
      
      // Display information for the constructed type and its generic
      // type definition.
      DisplayGenericTypeInfo( d->GetType() );
      DisplayGenericTypeInfo( d->GetType()->GetGenericTypeDefinition() );
      
      // Display information for an ordinary type.
      DisplayGenericTypeInfo( String::typeid );
   }
};
int main()
{
   Test::Main();
}
/* This example produces the following output:
--- Display information about a constructed type, its
    generic type definition, and an ordinary type.
System.Collections.Generic.Dictionary[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[TKey,TValue]
        Is this a generic type definition? True
        Is it a generic type? True
        List type arguments (2):
                TKey    (unassigned - parameter position 0)
                TValue  (unassigned - parameter position 1)
System.String
        Is this a generic type definition? False
        Is it a generic type? False
 */
using System;
using System.Reflection;
using System.Collections.Generic;
public class Test
{
    private static void DisplayGenericTypeInfo(Type t)
    {
        Console.WriteLine("\r\n{0}", t);
        Console.WriteLine("\tIs this a generic type definition? {0}", 
            t.IsGenericTypeDefinition);
        Console.WriteLine("\tIs it a generic type? {0}", 
            t.IsGenericType);
        if (t.IsGenericType)
        {
            // If this is a generic type, display the type arguments.
            //
            Type[] typeArguments = t.GetGenericArguments();
            Console.WriteLine("\tList type arguments ({0}):", 
                typeArguments.Length);
            foreach (Type tParam in typeArguments)
            {
                // If this is a type parameter, display its
                // position.
                //
                if (tParam.IsGenericParameter)
                {
                    Console.WriteLine("\t\t{0}\t(unassigned - parameter position {1})",
                        tParam,
                        tParam.GenericParameterPosition);
                }
                else
                {
                    Console.WriteLine("\t\t{0}", tParam);
                }
            }
        }
    }
    public static void Main()
    {
        Console.WriteLine("\r\n--- Display information about a constructed type, its");
        Console.WriteLine("    generic type definition, and an ordinary type.");
        // Create a Dictionary of Test objects, using strings for the
        // keys.       
        Dictionary<string, Test> d = new Dictionary<string, Test>();
        // Display information for the constructed type and its generic
        // type definition.
        DisplayGenericTypeInfo(d.GetType());
        DisplayGenericTypeInfo(d.GetType().GetGenericTypeDefinition());
        // Display information for an ordinary type.
        DisplayGenericTypeInfo(typeof(string));
    }
}
/* This example produces the following output:
--- Display information about a constructed type, its
    generic type definition, and an ordinary type.
System.Collections.Generic.Dictionary[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[TKey,TValue]
        Is this a generic type definition? True
        Is it a generic type? True
        List type arguments (2):
                TKey    (unassigned - parameter position 0)
                TValue  (unassigned - parameter position 1)
System.String
        Is this a generic type definition? False
        Is it a generic type? False
 */
open System
open System.Collections.Generic
type Test() = class end
let displayGenericTypeInfo (t: Type) =
    printfn $"\n{t}"
    printfn $"\tIs this a generic type definition? {t.IsGenericTypeDefinition}" 
    printfn $"\tIs it a generic type? {t.IsGenericType}" 
    if t.IsGenericType then
        // If this is a generic type, display the type arguments.
        let typeArguments = t.GetGenericArguments()
        printfn $"\tList type arguments ({typeArguments.Length}):"
        for tParam in typeArguments do
            // If this is a type parameter, display its
            // position.
            if tParam.IsGenericParameter then
                printfn $"\t\t{tParam}\t(unassigned - parameter position {tParam.GenericParameterPosition})"
            else
                printfn $"\t\t{tParam}"
printfn "\r\n--- Display information about a constructed type, its"
printfn "    generic type definition, and an ordinary type."
// Create a Dictionary of Test objects, using strings for the keys.       
let d = Dictionary<string, Test>()
// Display information for the constructed type and its generic
// type definition.
displayGenericTypeInfo (d.GetType())
displayGenericTypeInfo (d.GetType().GetGenericTypeDefinition())
// Display information for an ordinary type.
displayGenericTypeInfo typeof<string>
(* This example produces the following output:
--- Display information about a constructed type, its
    generic type definition, and an ordinary type.
System.Collections.Generic.Dictionary[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[TKey,TValue]
        Is this a generic type definition? True
        Is it a generic type? True
        List type arguments (2):
                TKey    (unassigned - parameter position 0)
                TValue  (unassigned - parameter position 1)
System.String
        Is this a generic type definition? False
        Is it a generic type? False
 *)
Imports System.Reflection
Imports System.Collections.Generic
Public Class Test
    Private Shared Sub DisplayGenericTypeInfo(ByVal t As Type) 
        Console.WriteLine(vbCrLf & t.ToString())
        
        Console.WriteLine(vbTab & "Is this a generic type definition? " _
            & t.IsGenericTypeDefinition)
        
        Console.WriteLine(vbTab & "Is it a generic type? " _
            & t.IsGenericType)
        
        If t.IsGenericType Then
            ' If this is a generic type, display the type arguments.
            '
            Dim typeArguments As Type() = t.GetGenericArguments()
            
            Console.WriteLine(vbTab & "List type arguments (" _
                & typeArguments.Length & "):")
            
            For Each tParam As Type In typeArguments
                ' If this is a type parameter, display its position.
                '
                If tParam.IsGenericParameter Then
                    Console.WriteLine(vbTab & vbTab & tParam.ToString() _
                        & vbTab & "(unassigned - parameter position " _
                        & tParam.GenericParameterPosition & ")")
                Else
                    Console.WriteLine(vbTab & vbTab & tParam.ToString())
                End If
            Next tParam
        End If
    
    End Sub 
    
    
    Public Shared Sub Main() 
        Console.WriteLine(vbCrLf & "--- Display information about a constructed type, its")
        Console.WriteLine("    generic type definition, and an ordinary type.")
        
        ' Create a Dictionary of Test objects, using strings for the
        ' keys.       
        Dim d As New Dictionary(Of String, Test)()
        DisplayGenericTypeInfo(d.GetType())
        DisplayGenericTypeInfo(d.GetType().GetGenericTypeDefinition())
        
        ' Display information for an ordinary type.
        DisplayGenericTypeInfo(GetType(String))
    
    End Sub
End Class
' This example produces the following output:
'
'--- Display information about a constructed type, its
'    generic type definition, and an ordinary type.
'
'System.Collections.Generic.Dictionary[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[TKey,TValue]
'        Is this a generic type definition? True
'        Is it a generic type? True
'        List type arguments (2):
'                TKey    (unassigned - parameter position 0)
'                TValue  (unassigned - parameter position 1)
'
'System.String
'        Is this a generic type definition? False
'        Is it a generic type? False
注解
泛型类型定义是一个模板,可从中构造其他类型。 例如,从泛型类型定义 G<T> (用 C# 语法表示;G(Of T)在 Visual Basic 或 generic <typename T> ref class G C++) ,可以通过使用包含Int32该类型的G(Of Integer)泛型参数列表调用 MakeGenericType 方法,在 Visual Basic) 中构造和实例化G<int>类型 (。 给定表示 Type 此构造类型的 对象,该方法 GetGenericTypeDefinition 将再次获取泛型类型定义。
              IsGenericTypeDefinition使用 属性确定是否可以从当前类型创建新类型。 如果属性 IsGenericTypeDefinition 返回 true,则可以调用 MakeGenericType 方法来创建新的泛型类型。
有关泛型反射中使用的术语的固定条件列表,请参阅 IsGenericType 属性注解。