Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anmärkning
Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.
Klassen Type är roten i System.Reflection funktionaliteten och är det primära sättet att komma åt metadata. Använd medlemmarna Type i för att få information om en typdeklaration, om medlemmar av en typ (till exempel konstruktorer, metoder, fält, egenskaper och händelser för en klass), samt modulen och sammansättningen där klassen distribueras.
Ingen behörighet krävs för att kod ska kunna använda reflektion för att få information om typer och deras medlemmar, oavsett åtkomstnivåer. Inga behörigheter krävs för att kod ska kunna använda reflektion för att få åtkomst till offentliga medlemmar eller andra medlemmar vars åtkomstnivåer skulle göra dem synliga under normal kompilering. Men för att koden ska kunna använda reflektion för att komma åt medlemmar som normalt inte är tillgängliga, till exempel privata eller interna metoder, eller skyddade fält av en typ som klassen inte ärver, måste koden ha ReflectionPermission. Se Säkerhetsöverväganden för reflektion.
Type är en abstrakt basklass som tillåter flera implementeringar. Systemet tillhandahåller alltid den härledda klassen RuntimeType. I reflektion skapas alla klasser som börjar med ordet Runtime bara en gång per objekt i systemet och stöder jämförelseåtgärder.
Anmärkning
I scenarier med multitrådning ska du inte låsa Type-objekt för att synkronisera åtkomsten till static data. Annan kod, som du inte har någon kontroll över, kan också låsa klasstypen. Detta kan leda till ett dödläge. Synkronisera i stället åtkomsten till statiska data genom att låsa ett privat static objekt.
Anmärkning
En härledd klass kan komma åt skyddade medlemmar i anropskodens basklasser. Dessutom tillåts åtkomst till sammansättningsmedlemmar i anropskodens sammansättning. Om du tillåts åtkomst i kod med tidig bindning tillåts du som regel också åtkomst i sen kod.
Anmärkning
Gränssnitt som utökar andra gränssnitt ärver inte de metoder som definieras i de utökade gränssnitten.
Vilka typer representerar ett typobjekt?
Den här klassen är trådsäker. flera trådar kan samtidigt läsa från en instans av den här typen. En instans av Type klassen kan representera någon av följande typer:
- Klasserna
- Värdetyper
- Matriser
- Gränssnitt
- Uppräkningar
- Delegeringar
- Konstruerade generiska typer och generiska typdefinitioner
- Typargument och typparametrar för konstruerade generiska typer, generiska typdefinitioner och generiska metoddefinitioner
Hämta ett typobjekt
Objektet Type som är associerat med en viss typ kan hämtas på följande sätt:
Instansmetoden Object.GetType returnerar ett Type objekt som representerar typen av instans. Eftersom alla hanterade typer härleds från ObjectGetType kan metoden anropas på en instans av vilken typ som helst.
I följande exempel anropas Object.GetType metoden för att fastställa körningstypen för varje objekt i en objektmatris.
object[] values = { "word", true, 120, 136.34, 'a' }; foreach (var value in values) Console.WriteLine($"{value} - type {value.GetType().Name}"); // The example displays the following output: // word - type String // True - type Boolean // 120 - type Int32 // 136.34 - type Double // a - type Charlet values: obj[] = [| "word"; true; 120; 136.34; 'a' |] for value in values do printfn $"{value} - type {value.GetType().Name}" // The example displays the following output: // word - type String // True - type Boolean // 120 - type Int32 // 136.34 - type Double // a - type CharModule Example1 Public Sub Main() Dim values() As Object = { "word", True, 120, 136.34, "a"c } For Each value In values Console.WriteLine("{0} - type {1}", value, value.GetType().Name) Next End Sub End Module ' The example displays the following output: ' word - type String ' True - type Boolean ' 120 - type Int32 ' 136.34 - type Double ' a - type CharDe statiska Type.GetType metoderna returnerar ett Type objekt som representerar en typ som anges av dess fullständigt kvalificerade namn.
Metoderna Module.GetTypes, Module.GetTypeoch Module.FindTypes returnerar
Typeobjekt som representerar de typer som definierats i en modul. Den första metoden kan användas för att hämta en matris med Type objekt för alla offentliga och privata typer som definierats i en modul. (Du kan hämta en instans avModulevia Assembly.GetModule metoden eller Assembly.GetModules eller via Type.Module egenskapen.)Objektet System.Reflection.Assembly innehåller ett antal metoder för att hämta de klasser som definierats i en sammansättning, inklusive Assembly.GetType, Assembly.GetTypesoch Assembly.GetExportedTypes.
Metoden FindInterfaces returnerar en filtrerad lista över gränssnittstyper som stöds av en typ.
Metoden GetElementType returnerar ett
Typeobjekt som representerar elementet.Metoderna GetInterfaces och GetInterface returnerar Type objekt som representerar de gränssnittstyper som stöds av en typ.
Metoden GetTypeArray returnerar en matris med Type objekt som representerar de typer som anges av en godtycklig uppsättning objekt. Objekten anges med en matris av typen Object.
Metoderna GetTypeFromProgID och GetTypeFromCLSID tillhandahålls för COM-samverkan. De returnerar ett Type objekt som representerar den typ som anges av en
ProgIDellerCLSID.Metoden GetTypeFromHandle tillhandahålls för samverkan. Det returnerar ett
Typeobjekt som representerar den typ som anges av en klassreferens.C#-
typeofoperatorn, C++typeid-operatorn och Visual Basic-operatornGetTypehämtarTypeobjektet för en typ.Metoden MakeGenericType returnerar ett Type objekt som representerar en konstruerad allmän typ, som är en öppen konstruktionstyp om dess ContainsGenericParameters egenskap returnerar
true, och en stängd konstruktionstyp i annat fall. En allmän typ kan bara instansieras om den stängs.Metoderna MakeArrayType, MakePointerTypeoch MakeByRefType returnerar Type objekt som representerar en matris av en angiven typ, en pekare till en angiven typ och typen av en referensparameter (
refi C#, "byref" i F#,ByRefi Visual Basic).
Jämför typobjekt för likhet
Ett Type objekt som representerar en typ är unikt. Type Två objektreferenser refererar till samma objekt om och endast om de representerar samma typ. Detta gör det möjligt att jämföra objekt med hjälp av Type referensjämlikhet. I följande exempel jämförs de Type objekt som representerar ett antal heltalsvärden för att avgöra om de är av samma typ.
long number1 = 1635429;
int number2 = 16203;
double number3 = 1639.41;
long number4 = 193685412;
// Get the type of number1.
Type t = number1.GetType();
// Compare types of all objects with number1.
Console.WriteLine($"Type of number1 and number2 are equal: {Object.ReferenceEquals(t, number2.GetType())}");
Console.WriteLine($"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}");
Console.WriteLine($"Type of number1 and number4 are equal: {Object.ReferenceEquals(t, number4.GetType())}");
// The example displays the following output:
// Type of number1 and number2 are equal: False
// Type of number1 and number3 are equal: False
// Type of number1 and number4 are equal: True
let number1 = 1635429L
let number2 = 16203
let number3 = 1639.41
let number4 = 193685412L
// Get the type of number1.
let t = number1.GetType()
// Compare types of all objects with number1.
printfn $"Type of number1 and number2 are equal: {Object.ReferenceEquals(t, number2.GetType())}"
printfn $"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}"
printfn $"Type of number1 and number4 are equal: {Object.ReferenceEquals(t, number4.GetType())}"
// The example displays the following output:
// Type of number1 and number2 are equal: False
// Type of number1 and number3 are equal: False
// Type of number1 and number4 are equal: True
Module Example
Public Sub Main()
Dim number1 As Long = 1635429
Dim number2 As Integer = 16203
Dim number3 As Double = 1639.41
Dim number4 As Long = 193685412
' Get the type of number1.
Dim t As Type = number1.GetType()
' Compare types of all objects with number1.
Console.WriteLine("Type of number1 and number2 are equal: {0}",
Object.ReferenceEquals(t, number2.GetType()))
Console.WriteLine("Type of number1 and number3 are equal: {0}",
Object.ReferenceEquals(t, number3.GetType()))
Console.WriteLine("Type of number1 and number4 are equal: {0}",
Object.ReferenceEquals(t, number4.GetType()))
End Sub
End Module
' The example displays the following output:
' Type of number1 and number2 are equal: False
' Type of number1 and number3 are equal: False
' Type of number1 and number4 are equal: True