Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.
De Type klasse is de hoofdmap van de System.Reflection functionaliteit en is de primaire manier om toegang te krijgen tot metagegevens. Gebruik de leden van Type de groep om informatie op te halen over een typedeclaratie, over de leden van een type (zoals de constructors, methoden, velden, eigenschappen en gebeurtenissen van een klasse), evenals de module en de assembly waarin de klasse wordt geïmplementeerd.
Er zijn geen machtigingen vereist voor code om weerspiegeling te gebruiken om informatie over typen en hun leden op te halen, ongeacht hun toegangsniveaus. Er zijn geen machtigingen vereist voor code om reflectie te gebruiken voor toegang tot openbare leden of andere leden waarvan de toegangsniveaus deze zichtbaar maken tijdens de normale compilatie. Als u echter wilt dat uw code reflectie gebruikt om toegang te krijgen tot leden die normaal gesproken niet toegankelijk zijn, zoals privé- of interne methoden, of beschermde velden van een type waarvan uw klasse niet erft, moet uw code beschikken over ReflectionPermission. Zie Beveiligingsoverwegingen voor reflectie.
Type is een abstracte basisklasse die meerdere implementaties toestaat. Het systeem levert altijd de afgeleide klasse RuntimeType. Ter overweging, alle klassen die beginnen met het woord Runtime worden slechts één keer per object in het systeem gecreëerd en ondersteunen vergelijkingsbewerkingen.
Opmerking
Vergrendel Type objecten in scenario's met multithreading niet om toegang tot gegevens te static synchroniseren. Andere code, waarvoor u geen controle hebt, kan ook uw klastype vergrendelen. Dit kan leiden tot een impasse. Synchroniseer in plaats daarvan de toegang tot statische gegevens door een privéobject static te vergrendelen.
Opmerking
Een afgeleide klasse heeft toegang tot beveiligde leden van de basisklassen van de aanroepende code. Toegang is ook verleend aan leden van de assembly van de aanroepende code. Als u toegang hebt in vroeg gebonden code, dan hebt u over het algemeen ook toegang in laat gebonden code.
Opmerking
Interfaces die andere interfaces uitbreiden, nemen niet de methoden over die zijn gedefinieerd in de uitgebreide interfaces.
Welke typen vertegenwoordigt een Type-object?
Deze klasse is thread veilig; meerdere threads kunnen gelijktijdig worden gelezen uit een exemplaar van dit type. Een exemplaar van de Type klasse kan een van de volgende typen vertegenwoordigen:
- Klassen
- Waardetypen
- Reeksen
- Koppelvlakken
- Opsommingen
- Gedelegeerden
- Samengestelde algemene typen en algemene typedefinities
- Typeargumenten en typeparameters van samengestelde algemene typen, algemene typedefinities en algemene methodedefinities
Een typeobject ophalen
Het Type object dat aan een bepaald type is gekoppeld, kan op de volgende manieren worden verkregen:
De instantiemethode Object.GetType retourneert een Type object dat het type van een exemplaar vertegenwoordigt. Omdat alle beheerde typen zijn afgeleid van Object, kan de GetType methode worden aangeroepen op een exemplaar van elk type.
In het volgende voorbeeld wordt de Object.GetType methode aangeroepen om het runtimetype van elk object in een objectmatrix te bepalen.
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 statische Type.GetType methoden retourneren een Type object dat een type vertegenwoordigt dat is opgegeven met de volledig gekwalificeerde naam.
Met de Module.GetTypesmethoden , Module.GetTypeen Module.FindTypes methoden worden objecten geretourneerd
Typedie de typen vertegenwoordigen die in een module zijn gedefinieerd. De eerste methode kan worden gebruikt om een matrix met Type objecten te verkrijgen voor alle openbare en persoonlijke typen die in een module zijn gedefinieerd. (U kunt een exemplaar verkrijgen vanModulevia de Assembly.GetModule of Assembly.GetModules methode of via de Type.Module eigenschap.)Het System.Reflection.Assembly object bevat een aantal methoden om de klassen op te halen die zijn gedefinieerd in een assembly, inclusief Assembly.GetType, Assembly.GetTypesen Assembly.GetExportedTypes.
De FindInterfaces methode retourneert een gefilterde lijst met interfacetypen die worden ondersteund door een type.
De GetElementType methode retourneert een
Typeobject dat het element vertegenwoordigt.De GetInterfaces en GetInterface methoden retourneren Type objecten die de interfacetypen vertegenwoordigen die door een type worden ondersteund.
De GetTypeArray methode retourneert een matrix met Type objecten die de typen vertegenwoordigen die zijn opgegeven door een willekeurige set objecten. De objecten worden opgegeven met een matrix van het type Object.
De GetTypeFromProgID en GetTypeFromCLSID methoden worden verstrekt voor COM-interoperabiliteit. Ze retourneren een Type object dat het type vertegenwoordigt dat is opgegeven door een
ProgIDofCLSID.De GetTypeFromHandle methode is beschikbaar voor interoperabiliteit. Het retourneert een
Typeobject dat het type vertegenwoordigt dat is opgegeven door een klassegreep.De C#
typeof-operator, de C++typeid-operator en de Visual Basic-operatorGetTypeverkrijgen hetTypeobject voor een type.De MakeGenericType methode retourneert een Type object dat een samengesteld algemeen type vertegenwoordigt. Dit is een open, samengesteld type als de ContainsGenericParameters eigenschap retourneert
trueen een gesloten, geconstrueerd type anders. Een algemeen type kan alleen worden geïnstantieerd als het wordt gesloten.De MakeArrayTypemethoden , MakePointerTypeen MakeByRefType methoden retourneren Type objecten die respectievelijk een matrix van een opgegeven type, een aanwijzer naar een opgegeven type en het type van een verwijzingsparameter (
refin C#, byref in F#,ByRefin Visual Basic) vertegenwoordigen.
Typeobjecten vergelijken voor gelijkheid
Een Type object dat een type vertegenwoordigt, is uniek. Dat wil gezegd: twee Type objectverwijzingen verwijzen naar hetzelfde object als en alleen als ze hetzelfde type vertegenwoordigen. Hierdoor kunnen objecten worden vergeleken Type met verwijzingsgelijkheid. In het volgende voorbeeld worden de Type objecten vergeleken die een aantal gehele getallen vertegenwoordigen om te bepalen of ze van hetzelfde type zijn.
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