System.Type, klasa
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
Klasa Type jest głównym elementem System.Reflection funkcjonalności i jest podstawowym sposobem uzyskiwania dostępu do metadanych. Użyj elementów Type członkowskich, aby uzyskać informacje o deklaracji typu, o składowych typu (takich jak konstruktory, metody, pola, właściwości i zdarzenia klasy), a także moduł i zestaw, w którym jest wdrażana klasa.
Do użycia odbicia kodu nie są wymagane żadne uprawnienia, aby uzyskać informacje o typach i ich elementach członkowskich, niezależnie od ich poziomów dostępu. Do korzystania z odbicia w celu uzyskania dostępu do publicznych członków lub innych członków, których poziomy dostępu nie będą widoczne podczas normalnej kompilacji, nie są wymagane żadne uprawnienia. Jednak aby kod używał odbicia w celu uzyskania dostępu do składowych, które zwykle byłyby niedostępne, takie jak metody prywatne lub wewnętrzne, lub pola chronione typu, klasa nie dziedziczy, kod musi mieć wartość ReflectionPermission. Zobacz Zagadnienia dotyczące zabezpieczeń dotyczące Emocje ion.
Type
jest abstrakcyjną klasą bazową, która umożliwia wiele implementacji. System zawsze zapewni klasę RuntimeType
pochodną . Odbicia wszystkie klasy rozpoczynające się od słowa Runtime są tworzone tylko raz na obiekt w systemie i obsługują operacje porównania.
Uwaga
W scenariuszach wielowątkowych nie blokuj Type obiektów w celu zsynchronizowania dostępu do static
danych. Inny kod, nad którym nie masz kontroli, może również zablokować typ klasy. Może to spowodować zakleszczenie. Zamiast tego zsynchronizuj dostęp do danych statycznych przez zablokowanie obiektu prywatnego static
.
Uwaga
Klasa pochodna może uzyskiwać dostęp do chronionych składowych klas bazowych wywołującego kodu. Ponadto dostęp jest dozwolony do zestawów członków zestawu zestawu kodu wywołującego. Jeśli dostęp jest dozwolony we wczesnym powiązaniu kodu, dostęp jest również dozwolony w kodzie z opóźnieniem.
Uwaga
Interfejsy rozszerzające inne interfejsy nie dziedziczą metod zdefiniowanych w interfejsach rozszerzonych.
Jakie typy reprezentuje obiekt Type?
Ta klasa jest bezpieczna wątkiem; wiele wątków może równocześnie odczytywać z wystąpienia tego typu. Wystąpienie Type klasy może reprezentować dowolny z następujących typów:
- Klasy
- Typy wartości
- Tablice
- Interfejsy
- Wyliczenia
- Delegaci
- Konstruowane typy ogólne i definicje typów ogólnych
- Argumenty typu i parametry typu skonstruowanych typów ogólnych, definicje typów ogólnych i definicje metod ogólnych
Pobieranie obiektu Typu
Type Obiekt skojarzony z określonym typem można uzyskać w następujący sposób:
Metoda wystąpienia Object.GetType zwraca Type obiekt reprezentujący typ wystąpienia. Ponieważ wszystkie typy zarządzane pochodzą z Objectmetody , GetType można wywołać metodę w wystąpieniu dowolnego typu.
Poniższy przykład wywołuje metodę w Object.GetType celu określenia typu środowiska uruchomieniowego każdego obiektu w tablicy obiektów.
object[] values = { "word", true, 120, 136.34, 'a' }; foreach (var value in values) Console.WriteLine("{0} - type {1}", value, value.GetType().Name); // The example displays the following output: // word - type String // True - type Boolean // 120 - type Int32 // 136.34 - type Double // a - type Char
let 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 Char
Module 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 Char
Metody statyczne Type.GetType zwracają Type obiekt reprezentujący typ określony przez jego w pełni kwalifikowaną nazwę.
Metody Module.GetTypes, Module.GetTypei Module.FindTypes zwracają
Type
obiekty reprezentujące typy zdefiniowane w module. Pierwsza metoda może służyć do uzyskania tablicy Type obiektów dla wszystkich typów publicznych i prywatnych zdefiniowanych w module. (Wystąpienie klasy można uzyskaćModule
za pomocą Assembly.GetModule metody lub Assembly.GetModules lub za pomocą Type.Module właściwości ).Obiekt System.Reflection.Assembly zawiera wiele metod pobierania klas zdefiniowanych w zestawie, w tym Assembly.GetType, Assembly.GetTypesi Assembly.GetExportedTypes.
Metoda FindInterfaces zwraca filtrowaną listę typów interfejsów obsługiwanych przez typ.
Metoda GetElementType zwraca
Type
obiekt reprezentujący element.Metody GetInterfaces i GetInterface zwracają Type obiekty reprezentujące typy interfejsów obsługiwane przez typ.
Metoda GetTypeArray zwraca tablicę Type obiektów reprezentujących typy określone przez dowolny zestaw obiektów. Obiekty są określane za pomocą tablicy typu Object.
Metody GetTypeFromProgID i GetTypeFromCLSID są udostępniane na potrzeby współdziałania modelu COM. Zwracają Type obiekt reprezentujący typ określony przez obiekt
ProgID
lubCLSID
.Metoda GetTypeFromHandle jest udostępniana na potrzeby współdziałania. Zwraca
Type
obiekt reprezentujący typ określony przez uchwyt klasy.Operator języka C#
typeof
, operator języka C++typeid
i operator języka Visual BasicGetType
uzyskująType
obiekt dla typu.Metoda MakeGenericType zwraca Type obiekt reprezentujący skonstruowany typ ogólny, który jest typem otwartym skonstruowanym, jeśli jego ContainsGenericParameters właściwość zwraca
true
wartość , a zamknięty typ skonstruowany inaczej. Typ ogólny można utworzyć tylko wtedy, gdy jest zamknięty.Metody MakeArrayType, MakePointerTypei MakeByRefType zwracają Type obiekty reprezentujące odpowiednio tablicę określonego typu, wskaźnik do określonego typu i typ parametru odwołania (
ref
w języku C#, "byref" w języku F#,ByRef
w Visual Basic).
Porównywanie obiektów typu pod kątem równości
Type Obiekt reprezentujący typ jest unikatowy, czyli dwa Type odwołania do obiektu odwołują się do tego samego obiektu, jeśli i tylko wtedy, gdy reprezentują ten sam typ. Umożliwia to porównanie Type obiektów przy użyciu równości odwołań. Poniższy przykład porównuje Type obiekty reprezentujące liczbę wartości całkowitych, aby określić, czy są one tego samego typu.
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: {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()));
// 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