Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.
La classe Type è la radice della funzionalità di System.Reflection ed è il modo principale per accedere ai metadati. Usare i membri di Type per ottenere informazioni su una dichiarazione di tipo, sui membri di un tipo (ad esempio costruttori, metodi, campi, proprietà ed eventi di una classe), nonché sul modulo e sull'assembly in cui viene distribuita la classe.
Non sono necessarie autorizzazioni per l'uso della reflection da parte del codice per ottenere informazioni sui tipi e sui relativi membri, indipendentemente dai livelli di accesso. Non sono necessarie autorizzazioni per l'uso della reflection da parte del codice per accedere ai membri pubblici o ad altri membri i cui livelli di accesso li renderebbero visibili durante la normale compilazione. Tuttavia, affinché il codice usi la reflection per accedere ai membri che normalmente sarebbero inaccessibili, ad esempio metodi privati o interni o campi protetti di un tipo che la classe non eredita, il codice deve avere ReflectionPermission. Consultare Considerazioni sulla sicurezza per la riflessione.
Type
è una classe base astratta che consente più implementazioni. Il sistema fornirà sempre la classe derivata RuntimeType
. In reflection, tutte le classi che iniziano con la parola Runtime vengono create una sola volta per oggetto nel sistema e supportano le operazioni di confronto.
Nota
Non bloccare gli oggetti Type negli scenari di multithreading per sincronizzare l'accesso ai dati static
. Un altro codice, su cui non si dispone di alcun controllo, potrebbe anche bloccare il tipo di classe. Ciò potrebbe comportare un deadlock. Sincronizzare invece l'accesso ai dati statici bloccando un oggetto static
privato.
Nota
Una classe derivata può accedere ai membri protetti delle classi di base del codice chiamante. Inoltre, l'accesso è consentito ai membri dell'assembly del codice chiamante. Come regola, se è consentito l'accesso nel codice con associazione anticipata, è anche consentito l'accesso nel codice ad associazione tardiva.
Nota
Le interfacce che estendono altre interfacce non ereditano i metodi definiti nelle interfacce estese.
Quali tipi rappresentano un oggetto Type?
Questa classe è thread-safe; più thread possono leggere simultaneamente da un'istanza di questo tipo. Un'istanza della classe Type può rappresentare uno dei tipi seguenti:
- Classi
- Tipi di valore
- Matrici
- Interfacce
- Enumerazioni
- Delegati
- Tipi generici costruiti e definizioni di tipi generici
- Argomenti di tipo e parametri di tipo di tipi generici costruiti, definizioni di tipi generici e definizioni di metodi generici
Recuperare un oggetto Type
L'oggetto Type associato a un tipo specifico può essere ottenuto nei modi seguenti:
Il metodo Object.GetType dell'istanza restituisce un oggetto Type che rappresenta il tipo di un'istanza di . Poiché tutti i tipi gestiti derivano da Object, il metodo GetType può essere chiamato in un'istanza di qualsiasi tipo.
Nell'esempio seguente viene chiamato il metodo Object.GetType per determinare il tipo di runtime di ogni oggetto in una matrice di oggetti.
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
I metodi Type.GetType statici restituiscono un oggetto Type che rappresenta un tipo specificato dal nome completo.
I metodi Module.GetTypes, Module.GetTypee Module.FindTypes restituiscono oggetti
Type
che rappresentano i tipi definiti in un modulo. Il primo metodo può essere usato per ottenere una matrice di oggetti Type per tutti i tipi pubblici e privati definiti in un modulo. È possibile ottenere un'istanza diModule
tramite il metodo Assembly.GetModule o Assembly.GetModules oppure tramite la proprietà Type.Module.L'oggetto System.Reflection.Assembly contiene diversi metodi per recuperare le classi definite in un assembly, tra cui Assembly.GetType, Assembly.GetTypese Assembly.GetExportedTypes.
Il metodo FindInterfaces restituisce un elenco filtrato di tipi di interfaccia supportati da un tipo.
Il metodo GetElementType restituisce un oggetto
Type
che rappresenta l'elemento .I metodi GetInterfaces e GetInterface restituiscono Type oggetti che rappresentano i tipi di interfaccia supportati da un tipo.
Il metodo GetTypeArray restituisce una matrice di oggetti Type che rappresentano i tipi specificati da un set arbitrario di oggetti. Gli oggetti vengono specificati con una matrice di tipo Object.
I metodi GetTypeFromProgID e GetTypeFromCLSID vengono forniti per l'interoperabilità COM. Restituiscono un oggetto Type che rappresenta il tipo specificato da un
ProgID
oCLSID
.Il metodo GetTypeFromHandle viene fornito per l'interoperabilità. Restituisce un oggetto
Type
che rappresenta il tipo specificato da un handle di classe.L'operatore
typeof
C#, l'operatoretypeid
C++ e l'operatore diGetType
Visual Basic ottengono l'oggettoType
per un tipo.Il metodo MakeGenericType restituisce un oggetto Type che rappresenta un tipo generico costruito costruito, ovvero un tipo costruito aperto se la relativa proprietà ContainsGenericParameters restituisce
true
e un tipo costruito chiuso in caso contrario. È possibile istanziare un tipo generico solo se è chiuso.I metodi MakeArrayType, MakePointerTypee MakeByRefType restituiscono Type oggetti che rappresentano rispettivamente una matrice di un tipo specificato, un puntatore a un tipo specificato e il tipo di un parametro di riferimento (
ref
in C#, 'byref' in F#,ByRef
in Visual Basic).
Confrontare gli oggetti di tipo per verificarne l'uguaglianza
Oggetto Type che rappresenta un tipo è univoco; ovvero due riferimenti all'oggetto Type fanno riferimento allo stesso oggetto se e solo se rappresentano lo stesso tipo. In questo modo è possibile confrontare gli oggetti Type usando l'uguaglianza dei riferimenti. Nell'esempio seguente vengono confrontati gli oggetti Type che rappresentano un numero di valori integer per determinare se sono dello stesso tipo.
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