Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 członkowskich Type, 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 assemblia, w której klasa jest wdrażana.
Aby używać refleksji do uzyskiwania informacji o typach i ich członkach, nie są wymagane żadne uprawnienia, niezależnie od poziomu dostępu. Do korzystania z mechanizmu refleksji w celu uzyskania dostępu do publicznych członków lub innych członków, których poziomy dostępu będą widoczne podczas normalnej kompilacji, nie są wymagane żadne uprawnienia. Jednak aby kod używał refleksji do uzyskania dostępu do składowych, które normalnie byłyby niedostępne, takich jak metody prywatne lub wewnętrzne, bądź pola chronione typu, którego klasa nie dziedziczy, kod musi mieć ReflectionPermission. Zobacz Zagadnienia dotyczące zabezpieczeń w kontekście odbicia.
Type
jest abstrakcyjną klasą bazową, która umożliwia wiele implementacji. System zawsze zapewni klasę RuntimeType
pochodną. Przy rozważaniu, wszystkie klasy rozpoczynające się od słowa Runtime są tworzone tylko raz na obiekt w systemie i obsługują operacje porównawcze.
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 mają członkowie zestawu kodu wywołującego. Z reguły, jeśli masz dostęp w kodzie ze wczesnym wiązaniem, to masz również dostęp w kodzie z opóźnionym wiązaniem.
Uwaga
Interfejsy rozszerzające inne interfejsy nie dziedziczą metod zdefiniowanych w interfejsach rozszerzonych.
Jakie typy reprezentuje obiekt Type?
Ta klasa jest bezpieczna wątkowo; wiele wątków może jednocześnie odczytywać z egzemplarza tego typu. Wystąpienie Type klasy może reprezentować dowolny z następujących typów:
- Klasy
- Typy wartości
- Tablice
- Interfejsy
- Wyliczenia
- Delegatów
- 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 instancji Object.GetType zwraca obiekt Type reprezentujący typ instancji. Ponieważ wszystkie typy zarządzane pochodzą od Object, metodę GetType można wywołać na 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($"{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
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. (Można uzyskać wystąpienieModule
za pomocą metody Assembly.GetModule lub Assembly.GetModules, albo za pomocą właściwości Type.Module.)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
ProgID
lubCLSID
.Metoda GetTypeFromHandle jest udostępniana na potrzeby współdziałania. Obiekt
Type
reprezentujący typ określony przez uchwyt klasy jest zwracany.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 otwartym typem skonstruowanym, jeśli jego właściwość ContainsGenericParameters zwraca
true
wartość, a zamknięty typ skonstruowany w przeciwnym razie. 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: {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