Type.GetGenericTypeDefinition Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Returnerar ett Type objekt som representerar en allmän typdefinition som den aktuella generiska typen kan konstrueras från.
public:
abstract Type ^ GetGenericTypeDefinition();
public:
virtual Type ^ GetGenericTypeDefinition();
public abstract Type GetGenericTypeDefinition();
public virtual Type GetGenericTypeDefinition();
abstract member GetGenericTypeDefinition : unit -> Type
abstract member GetGenericTypeDefinition : unit -> Type
override this.GetGenericTypeDefinition : unit -> Type
Public MustOverride Function GetGenericTypeDefinition () As Type
Public Overridable Function GetGenericTypeDefinition () As Type
Returer
Ett Type objekt som representerar en allmän typ som den aktuella typen kan konstrueras från.
Undantag
Den aktuella typen är inte en allmän typ. Det vill: IsGenericType returnerar false.
Den anropade metoden stöds inte i basklassen. Härledda klasser måste tillhandahålla en implementering.
Exempel
I följande kodexempel skapas en instans av en konstruerad typ med hjälp av vanlig skapande av instanser och använder GetType sedan metoderna och GetGenericTypeDefinition för att hämta den konstruerade typen och den generiska typdefinitionen. I det här exemplet används den allmänna Dictionary<TKey,TValue> typen. Den konstruerade typen representerar ett Dictionary<TKey,TValue> objekt Test med strängnycklar.
using System;
using System.Reflection;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
Console.WriteLine("\r\n--- Get the generic type that defines a constructed type.");
// Create a Dictionary of Test objects, using strings for the
// keys.
Dictionary<string, Test> d = new Dictionary<string, Test>();
// Get a Type object representing the constructed type.
//
Type constructed = d.GetType();
DisplayTypeInfo(constructed);
Type generic = constructed.GetGenericTypeDefinition();
DisplayTypeInfo(generic);
}
private static void DisplayTypeInfo(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);
Type[] typeArguments = t.GetGenericArguments();
Console.WriteLine("\tList type arguments ({0}):", typeArguments.Length);
foreach (Type tParam in typeArguments)
{
Console.WriteLine("\t\t{0}", tParam);
}
}
}
/* 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
*/
open System
open System.Collections.Generic
type Test() = class end
let displayTypeInfo (t: Type) =
printfn $"\n{t}"
printfn $"\tIs this a generic type definition? {t.IsGenericTypeDefinition}"
printfn $"\tIs it a generic type? {t.IsGenericType}"
let typeArguments = t.GetGenericArguments()
printfn $"\tList type arguments ({typeArguments.Length}):"
for tParam in typeArguments do
printfn $"\t\t{tParam}"
printfn "\n--- Get the generic type that defines a constructed type."
// Create a Dictionary of Test objects, using strings for the keys.
let d = Dictionary<string, Test>()
// Get a Type object representing the constructed type.
let constructed = d.GetType()
displayTypeInfo constructed
let generic = constructed.GetGenericTypeDefinition()
displayTypeInfo generic
(* 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
*)
Imports System.Reflection
Imports System.Collections.Generic
Public Class Test
Public Shared Sub Main()
Console.WriteLine(vbCrLf & "--- Get the generic type that defines a constructed type.")
' Create a Dictionary of Test objects, using strings for the
' keys.
Dim d As New Dictionary(Of String, Test)
' Get a Type object representing the constructed type.
'
Dim constructed As Type = d.GetType()
DisplayTypeInfo(constructed)
Dim generic As Type = constructed.GetGenericTypeDefinition()
DisplayTypeInfo(generic)
End Sub
Private Shared Sub DisplayTypeInfo(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)
Dim typeArguments As Type() = t.GetGenericArguments()
Console.WriteLine(vbTab & "List type arguments (" _
& typeArguments.Length & "):")
For Each tParam As Type In typeArguments
Console.WriteLine(vbTab & vbTab & tParam.ToString())
Next tParam
End Sub
End Class
' 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
'
Kommentarer
En allmän typdefinition är en mall som andra typer kan konstrueras från. Från den allmänna C#-typdefinitionen G<T>kan du till exempel skapa och instansiera typen G<int>. Med tanke på ett Type objekt som representerar den här konstruerade typen GetGenericTypeDefinition returnerar metoden den generiska typdefinitionen.
Om två konstruerade typer skapas från samma generiska typdefinition, med samma typargument, GetGenericTypeDefinition returnerar metoden samma Type objekt för båda typerna.
Om du anropar metoden för GetGenericTypeDefinition ett Type objekt som redan representerar en allmän typdefinition returneras den aktuella Type.
Important
En matris med generiska typer är inte i sig generisk. I C#-koden A<int>[] v; eller Visual Basic-koden Dim v() As A(Of Integer) är typen av variabel v inte generisk. Använd IsGenericType för att avgöra om en typ är allmän innan du anropar GetGenericTypeDefinition.
En lista över de invarianta villkoren för termer som används i allmän reflektion finns i egenskapskommentarerna IsGenericType .