Type.GetType Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ottiene un oggetto Type che rappresenta il tipo specificato.
Overload
GetType() |
Ottiene l'oggetto Type corrente. |
GetType(String) |
Ottiene l'oggetto Type con il nome specificato, eseguendo una ricerca con distinzione tra maiuscole e minuscole. |
GetType(String, Boolean) |
Ottiene l'oggetto Type con il nome specificato, eseguendo una ricerca con distinzione tra maiuscole e minuscole e specificando se generare un'eccezione in caso il tipo non venga trovato. |
GetType(String, Boolean, Boolean) |
Ottiene l'oggetto Type con il nome specificato, che indica se generare un'eccezione quando viene trovato il tipo e se eseguire una ricerca con distinzione tra maiuscole e minuscole. |
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) |
Ottiene il tipo con il nome specificato, fornendo facoltativamente metodi personalizzati per risolvere l'assembly e il tipo. |
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean) |
Ottiene il tipo con il nome specificato, indicando se generare un'eccezione se il tipo non viene trovato e fornendo facoltativamente metodi personalizzati per risolvere l'assembly e il tipo. |
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) |
Ottiene il tipo con il nome specificato, indicando se eseguire una ricerca facendo distinzione tra maiuscole e minuscole e se generare un'eccezione se il tipo non viene trovato e fornendo facoltativamente metodi personalizzati per risolvere l'assembly e il tipo. |
GetType()
Ottiene l'oggetto Type corrente.
public:
Type ^ GetType();
public:
virtual Type ^ GetType();
public Type GetType ();
override this.GetType : unit -> Type
Public Function GetType () As Type
Restituisce
Oggetto Type corrente.
Implementazioni
Eccezioni
Viene richiamato un inizializzatore di classi e viene generata un'eccezione.
Vedi anche
Si applica a
GetType(String)
Ottiene l'oggetto Type con il nome specificato, eseguendo una ricerca con distinzione tra maiuscole e minuscole.
public:
static Type ^ GetType(System::String ^ typeName);
public static Type GetType (string typeName);
public static Type? GetType (string typeName);
static member GetType : string -> Type
Public Shared Function GetType (typeName As String) As Type
Parametri
- typeName
- String
Nome qualificato dall'assembly del tipo da ottenere. Vedere AssemblyQualifiedName. Se il tipo è incluso nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, è sufficiente specificare il nome del tipo qualificato in base al relativo spazio dei nomi.
Restituisce
Tipo con il nome specificato, se presente; in caso contrario, null
.
Eccezioni
typeName
è null
.
Viene richiamato un inizializzatore di classi e viene generata un'eccezione.
typeName
rappresenta un tipo generico che ha un tipo di puntatore, un tipo ByRef
o Void tra i relativi argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico che ha un numero errato di argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico e uno dei relativi argomenti di tipo non soddisfa i vincoli per il parametro di tipo corrispondente.
typeName
rappresenta una matrice di TypedReference.
L'assembly o una delle relative dipendenze è stato trovato, ma non può essere caricato.
Nota: in .NET per le Windows Store o nella libreria di classi portabile intercettare invece l'eccezione della classe di base , https://docs.microsoft.com/dotnet/standard/cross-platform/cross-platform-development-with-the-portable-class-library IOException .
L'assembly o una delle relative dipendenze non è valido.
-oppure-
Attualmente è caricata la versione 2.0 o successiva di Common Language Runtime e l'assembly è stato compilato con una versione successiva.
Esempio
Nell'esempio seguente viene recuperato il tipo di System.Int32
e viene utilizzato tale oggetto tipo per visualizzare la proprietà di FullName System.Int32
.
using namespace System;
int main()
{
try {
// Get the type of a specified class.
Type^ myType1 = Type::GetType( "System.Int32" );
Console::WriteLine( "The full name is {0}.\n", myType1->FullName );
}
catch ( TypeLoadException^ e ) {
Console::WriteLine("{0}: Unable to load type System.Int32",
e->GetType()->Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type^ myType2 = Type::GetType( "NoneSuch", true );
Console::WriteLine( "The full name is {0}.", myType2->FullName );
}
catch ( TypeLoadException^ e ) {
Console::WriteLine("{0}: Unable to load type NoneSuch",
e->GetType()->Name);
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
using System;
class Example
{
public static void Main()
{
try {
// Get the type of a specified class.
Type myType1 = Type.GetType("System.Int32");
Console.WriteLine("The full name is {0}.\n", myType1.FullName);
}
catch (TypeLoadException e)
{
Console.WriteLine("{0}: Unable to load type System.Int32", e.GetType().Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type myType2 = Type.GetType("NoneSuch", true);
Console.WriteLine("The full name is {0}.", myType2.FullName);
}
catch(TypeLoadException e) {
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name);
}
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
Class Example
Public Shared Sub Main()
Try
' Get the type of the specified class.
Dim myType1 As Type = Type.GetType("System.Int32")
Console.WriteLine("The full name is {0}.", myType1.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type System.Int32",
e.GetType().Name)
End Try
Console.WriteLine()
Try
' Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Dim myType2 As Type = Type.GetType("NoneSuch", True)
Console.WriteLine("The full name is {0}.", myType2.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name)
End Try
End Sub
End Class
' The example displays the following output:
' The full name is System.Int32.
'
' TypeLoadException: Unable to load type NoneSuch
Commenti
È possibile usare il metodo per ottenere un oggetto per un tipo in un altro assembly se si conosce il nome completo dell'assembly, che GetType può essere ottenuto da Type AssemblyQualifiedName . GetType causa il caricamento dell'assembly specificato in typeName
. È anche possibile caricare un assembly usando Assembly.Load il metodo e quindi usare il metodo o per ottenere oggetti Assembly.GetType Assembly.GetTypes Type . Se un tipo si trova in un assembly noto al programma in fase di compilazione, è più efficiente usare in C# o typeof
l'operatore GetType
in Visual Basic.
Nota
Se typeName
non è possibile trovare , la chiamata al metodo restituisce GetType(String) null
. Non genera un'eccezione. Per controllare se viene generata un'eccezione, chiamare un overload del GetType metodo con un parametro throwOnError
.
GetType funziona solo sugli assembly caricati dal disco. Se si chiama per cercare un tipo definito in un assembly dinamico definito tramite i servizi, è possibile che si GetType System.Reflection.Emit otterrà un comportamento incoerente. Il comportamento dipende dal fatto che l'assembly dinamico sia persistente, ad esempio creato utilizzando le modalità di accesso RunAndSave
Save
o System.Reflection.Emit.AssemblyBuilderAccess dell'enumerazione . Se l'assembly dinamico è persistente ed è stato scritto su disco prima della chiamata a , il caricatore trova l'assembly salvato su disco, carica l'assembly e recupera il tipo da GetType
tale assembly. Se l'assembly non è stato salvato su disco quando GetType
viene chiamato il metodo , il metodo restituisce null
. GetType
non comprende gli assembly dinamici temporanei; Pertanto, la chiamata GetType
di per recuperare un tipo in un assembly dinamico temporaneo restituisce null
.
Per usare GetType
in un modulo dinamico, sottoscrivere l'evento AppDomain.AssemblyResolve e chiamare prima di GetType
salvare. In caso contrario, si otterrà due copie dell'assembly in memoria.
Nella tabella seguente vengono illustrati i membri di una classe di base restituiti dai Get
metodi quando si esegue la reflecting su un tipo.
Tipo di membro | Static | Non statico |
---|---|---|
Costruttore | No | No |
Campo | No | Sì. Un campo è sempre hide-by-name-and-signature. |
Evento | Non applicabile | La regola di sistema dei tipi comuni è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature. Vedere la nota 2 di seguito. |
Metodo | No | Sì. Un metodo (virtuale e non virtuale) può essere hide-by-name o hide-by-name-and-signature. |
Tipo annidato | No | No |
Proprietà | Non applicabile | La regola di sistema dei tipi comuni è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature. Vedere la nota 2 di seguito. |
Hide-by-name-and-signature considera tutte le parti della firma, inclusi modificatori personalizzati, tipi restituiti, tipi di parametro, sentinel e convenzioni di chiamata non gestite. Si tratta di un confronto binario.
Per la reflection, le proprietà e gli eventi sono hide-by-name-and-signature. Se si dispone di una proprietà con una funzione di accesso get e una funzione di accesso set nella classe di base, ma la classe derivata ha solo una funzione di accesso get, la proprietà della classe derivata nasconde la proprietà della classe base e non sarà possibile accedere al setter nella classe di base.
Gli attributi personalizzati non fanno parte del sistema di tipi comune.
Le matrici o i tipi COM non vengono cercati a meno che non siano già stati caricati nella tabella delle classi disponibili.
typeName
può essere il nome del tipo qualificato dal relativo spazio dei nomi o un nome completo di assembly che include una specifica del nome dell'assembly. Vedere AssemblyQualifiedName.
Se include lo spazio dei nomi ma non il nome dell'assembly, questo metodo cerca solo typeName
l'assembly dell'oggetto chiamante e mscorlib.dll/System.Private.CoreLib.dll, in questo ordine. Se typeName è completo con il nome parziale o completo dell'assembly, questo metodo esegue la ricerca nell'assembly specificato. Se l'assembly ha un nome sicuro, è necessario un nome di assembly completo.
La AssemblyQualifiedName proprietà restituisce un nome di tipo completo, inclusi i tipi annidati, il nome dell'assembly e gli argomenti di tipo generico. Tutti i compilatori che supportano Common Language Runtime generano il nome semplice di una classe annidata e la reflection costruisce un nome non modificato quando viene eseguita una query, in base alle convenzioni seguenti.
Nota
Nella versione .NET Framework 2.0, l'architettura del processore viene aggiunta all'identità dell'assembly e può essere specificata come parte delle stringhe del nome dell'assembly. Ad esempio, "ProcessorArchitecture=msil". Tuttavia, non è incluso nella stringa restituita dalla proprietà , per AssemblyQualifiedName motivi di compatibilità. È anche possibile caricare i tipi creando AssemblyName un oggetto e passandolo a un overload appropriato del Load metodo . È quindi possibile usare il Assembly.GetType metodo per caricare i tipi dall'assembly. Vedere anche AssemblyName.ProcessorArchitecture.
Delimitatore | Significato |
---|---|
Barra rovesciata (\) | Carattere di escape. |
Backtick (') | Precede una o più cifre che rappresentano il numero di parametri di tipo, posizionati alla fine del nome di un tipo generico. |
Parentesi quadre ([]) | Racchiudere un elenco di argomenti di tipo generico per un tipo generico costruito; All'interno di un elenco di argomenti di tipo, racchiudere un tipo qualificato dall'assembly. |
Virgola (,) | Precede il nome dell'assembly. |
Punto (.) | Indica gli identificatori dello spazio dei nomi. |
Segno più (+) | Precede una classe annidata. |
Ad esempio, il nome completo di una classe potrebbe essere simile al seguente:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
Se lo spazio dei nomi fosse TopNamespace.Sub+Namespace, la stringa deve precedere il segno più (+) con un carattere di escape ( ) per impedirne l'interpretazione come separatore di \ annidamento. La reflection genera questa stringa come segue:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
"++" diventa " \ + \ +" e " \ " diventa " \ \ ".
Questo nome completo può essere reso persistente e successivamente usato per caricare Type . Per cercare e caricare un Type oggetto , usare solo con il nome del tipo o con il nome di tipo completo GetType dell'assembly. GetType con il nome del tipo, cerca solo Type nell'assembly del chiamante e quindi nell'assembly di sistema. GetType con il nome di tipo completo dell'assembly, cerca Type in qualsiasi assembly.
I nomi dei tipi possono includere caratteri finali che indicano informazioni aggiuntive sul tipo, ad esempio se il tipo è un tipo riferimento, un tipo puntatore o un tipo matrice. Per recuperare il nome del tipo senza questi caratteri finali, usare t.GetElementType().ToString()
, dove è il tipo t
.
Gli spazi sono rilevanti in tutti i componenti del nome del tipo, ad eccezione del nome dell'assembly. Nel nome dell'assembly sono rilevanti gli spazi prima del separatore ",", ma gli spazi dopo il separatore "," vengono ignorati.
Il nome di un tipo generico termina con un punto di riferimento indietro ( ) seguito da cifre che ` rappresentano il numero di argomenti di tipo generico. Lo scopo di questa modifica dei nomi è consentire ai compilatori di supportare tipi generici con lo stesso nome ma con numeri diversi di parametri di tipo, che si verificano nello stesso ambito. Ad esempio, la reflection restituisce i nomi mangled e dai metodi Tuple`1
Tuple`2
generici Tuple(Of T)
e in Tuple(Of T0, T1)
Visual Basic, o e in Visual Tuple<T>
Tuple<T0, T1>
C#.
Per i tipi generici, l'elenco di argomenti di tipo è racchiuso tra parentesi quadre e gli argomenti di tipo sono separati da virgole. Ad esempio, un generico Dictionary<TKey,TValue> ha due parametri di tipo. Un Dictionary<TKey,TValue> di con chiavi di tipo può essere rappresentato come MyType
String segue:
System.Collections.Generic.Dictionary`2[System.String,MyType]
Per specificare un tipo qualificato dall'assembly all'interno di un elenco di argomenti di tipo, racchiudere il tipo qualificato dall'assembly tra parentesi quadre. In caso contrario, le virgole che separano le parti del nome completo dell'assembly vengono interpretate come argomenti di tipo aggiuntivi. Ad esempio, un Dictionary<TKey,TValue> di MyType
fromMyAssembly.dll, con chiavi di tipo String , può essere specificato come segue:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
Nota
Un tipo qualificato dall'assembly può essere racchiuso tra parentesi solo quando viene visualizzato all'interno di un elenco di parametri di tipo. Le regole per la ricerca di tipi qualificati e non qualificati negli elenchi di parametri di tipo sono le stesse regole per i tipi non qualificati e non qualificati.
I tipi nullable sono un caso speciale di tipi generici. Ad esempio, un nullable Int32 è rappresentato dalla stringa "System.Nullable'1[System.Int32]".
Nota
In C#, C++ e Visual Basic è anche possibile ottenere tipi nullable usando operatori di tipo. Ad esempio, il tipo nullable viene restituito da Boolean in typeof(Nullable<bool>)
C#, da in Nullable<Boolean>::typeid
C++ e GetType(Nullable(Of Boolean))
da in Visual Basic.
Nella tabella seguente viene illustrata la sintassi utilizzata con GetType
per vari tipi.
Ottenere | Uso |
---|---|
Oggetto nullable Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Puntatore non gestito a MyType |
Type.GetType("MyType*") |
Puntatore non gestito a un puntatore a MyType |
Type.GetType("MyType**") |
Puntatore gestito o riferimento a MyType |
Type.GetType("MyType&") . Si noti che, a differenza dei puntatori, i riferimenti sono limitati a un solo livello. |
Una classe padre e una classe annidata | Type.GetType("MyParentClass+MyNestedClass") |
Matrice unidimensionale con limite inferiore 0 | Type.GetType("MyType[]") |
Matrice unidimensionale con limite inferiore sconosciuto | Type.GetType("MyType[*]") |
Matrice n-dimensionale | Una virgola (,) tra parentesi quadre per un totale di n-1 volte. Ad esempio, System.Object[,,] rappresenta una matrice Object tridimensionale. |
Matrice di matrici unidimensionali | Type.GetType("MyType[][]") |
Matrice bidimensionale rettangolare con limiti inferiori sconosciuti | Type.GetType("MyType[,]") |
Tipo generico con un argomento di tipo | Type.GetType("MyGenericType`1[MyType]") |
Tipo generico con due argomenti di tipo | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
Tipo generico con due argomenti di tipo qualificati dall'assembly | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
Tipo generico qualificato dall'assembly con un argomento di tipo qualificato dall'assembly | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
Tipo generico il cui argomento di tipo è un tipo generico con due argomenti di tipo | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |
Vedi anche
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- Specifica di nomi di tipo completi
Si applica a
GetType(String, Boolean)
Ottiene l'oggetto Type con il nome specificato, eseguendo una ricerca con distinzione tra maiuscole e minuscole e specificando se generare un'eccezione in caso il tipo non venga trovato.
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError);
public static Type GetType (string typeName, bool throwOnError);
public static Type? GetType (string typeName, bool throwOnError);
static member GetType : string * bool -> Type
Public Shared Function GetType (typeName As String, throwOnError As Boolean) As Type
Parametri
- typeName
- String
Nome qualificato dall'assembly del tipo da ottenere. Vedere AssemblyQualifiedName. Se il tipo è incluso nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, è sufficiente specificare il nome del tipo qualificato in base al relativo spazio dei nomi.
- throwOnError
- Boolean
true
per generare un'eccezione se non è possibile trovare il tipo; false
per restituire null
. Se si specifica false
vengono eliminate alcune condizioni di eccezione, ma non tutte. Vedere la sezione relativa alle eccezioni.
Restituisce
Tipo con il nome specificato. Se il tipo non viene trovato, il parametro throwOnError
specifica se viene restituito null
o se viene generata un'eccezione. In alcuni casi, viene generata un'eccezione indipendentemente dal valore di throwOnError
. Vedere la sezione relativa alle eccezioni.
Eccezioni
typeName
è null
.
Viene richiamato un inizializzatore di classi e viene generata un'eccezione.
throwOnError
è true
e il tipo non è stato trovato.
-oppure-
throwOnError
è true
e typeName
contiene caratteri non validi, ad esempio una scheda incorporata.
-oppure-
throwOnError
è true
e typeName
è una stringa vuota.
-oppure-
throwOnError
è true
e typeName
rappresenta un tipo di matrice con una dimensione non valida.
-oppure-
typeName
rappresenta una matrice di TypedReference.
throwOnError
è true
e la sintassi di typeName
non è valida. Ad esempio: "MyType[,*,]".
-oppure-
typeName
rappresenta un tipo generico che ha un tipo di puntatore, un tipo ByRef
o Void tra i relativi argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico che ha un numero errato di argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico e uno dei relativi argomenti di tipo non soddisfa i vincoli per il parametro di tipo corrispondente.
throwOnError
è true
e l'assembly o una delle sue dipendenze non è stato trovato.
L'assembly o una delle relative dipendenze è stato trovato, ma non può essere caricato.
Nota: in .NET per le app Windows Store o la libreria di classi portabileintercettare invece l'eccezione della classe di IOException base, .
L'assembly o una delle relative dipendenze non è valido.
-oppure-
Attualmente è caricata la versione 2.0 o successiva di Common Language Runtime e l'assembly è stato compilato con una versione successiva.
Esempio
Nell'esempio seguente viene recuperato il tipo di System.Int32
e viene utilizzato tale oggetto tipo per visualizzare la proprietà di FullName System.Int32
. Se un oggetto tipo fa riferimento a un assembly che non esiste, in questo esempio viene generata un'eccezione.
using namespace System;
int main()
{
try {
// Get the type of a specified class.
Type^ myType1 = Type::GetType( "System.Int32" );
Console::WriteLine( "The full name is {0}.\n", myType1->FullName );
}
catch ( TypeLoadException^ e ) {
Console::WriteLine("{0}: Unable to load type System.Int32",
e->GetType()->Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type^ myType2 = Type::GetType( "NoneSuch", true );
Console::WriteLine( "The full name is {0}.", myType2->FullName );
}
catch ( TypeLoadException^ e ) {
Console::WriteLine("{0}: Unable to load type NoneSuch",
e->GetType()->Name);
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
using System;
class Example
{
public static void Main()
{
try {
// Get the type of a specified class.
Type myType1 = Type.GetType("System.Int32");
Console.WriteLine("The full name is {0}.\n", myType1.FullName);
}
catch (TypeLoadException e)
{
Console.WriteLine("{0}: Unable to load type System.Int32", e.GetType().Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type myType2 = Type.GetType("NoneSuch", true);
Console.WriteLine("The full name is {0}.", myType2.FullName);
}
catch(TypeLoadException e) {
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name);
}
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
Class Example
Public Shared Sub Main()
Try
' Get the type of the specified class.
Dim myType1 As Type = Type.GetType("System.Int32")
Console.WriteLine("The full name is {0}.", myType1.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type System.Int32",
e.GetType().Name)
End Try
Console.WriteLine()
Try
' Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Dim myType2 As Type = Type.GetType("NoneSuch", True)
Console.WriteLine("The full name is {0}.", myType2.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name)
End Try
End Sub
End Class
' The example displays the following output:
' The full name is System.Int32.
'
' TypeLoadException: Unable to load type NoneSuch
Commenti
È possibile usare il metodo per ottenere un oggetto per un tipo in un altro assembly se si conosce il nome completo dell'assembly, che GetType può essere ottenuto da Type AssemblyQualifiedName . GetType causa il caricamento dell'assembly specificato in typeName
. È anche possibile caricare un assembly usando Assembly.Load il metodo e quindi usare il metodo o per ottenere oggetti Assembly.GetType Assembly.GetTypes Type . Se un tipo si trova in un assembly noto al programma in fase di compilazione, è più efficiente usare in C# o typeof
l'operatore GetType
in Visual Basic.
GetType
funziona solo sugli assembly caricati dal disco. Se si chiama per cercare un tipo definito in un assembly dinamico definito tramite i servizi, è possibile che si GetType
System.Reflection.Emit otterrà un comportamento incoerente. Il comportamento dipende dal fatto che l'assembly dinamico sia persistente, ad esempio creato utilizzando le modalità di accesso RunAndSave
Save
o System.Reflection.Emit.AssemblyBuilderAccess dell'enumerazione . Se l'assembly dinamico è persistente ed è stato scritto su disco prima della chiamata a , il caricatore trova l'assembly salvato su disco, carica l'assembly e recupera il tipo da GetType
tale assembly. Se l'assembly non è stato salvato su disco quando GetType
viene chiamato il metodo , il metodo restituisce null
. GetType
non comprende gli assembly dinamici temporanei; Pertanto, la chiamata GetType
di per recuperare un tipo in un assembly dinamico temporaneo restituisce null
.
Per usare GetType
in un modulo dinamico, sottoscrivere l'evento AppDomain.AssemblyResolve e chiamare prima di GetType
salvare. In caso contrario, si otterrà due copie dell'assembly in memoria.
Il parametro specifica cosa accade quando il tipo non viene trovato ed elimina anche alcune altre condizioni di eccezione, come throwOnError
descritto nella sezione Eccezioni. Alcune eccezioni vengono generate indipendentemente dal valore di throwOnError
. Ad esempio, se il tipo viene trovato ma non può essere caricato, viene generata un'eccezione TypeLoadException anche se throwOnError
è false
.
Nella tabella seguente vengono illustrati i membri di una classe di base restituiti dai Get
metodi quando si esegue la reflecting su un tipo.
Tipo di membro | Static | Non statico |
---|---|---|
Costruttore | No | No |
Campo | No | Sì. Un campo è sempre hide-by-name-and-signature. |
Evento | Non applicabile | La regola di sistema dei tipi comuni è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature. Vedere la nota 2 di seguito. |
Metodo | No | Sì. Un metodo (virtuale e non virtuale) può essere hide-by-name o hide-by-name-and-signature. |
Tipo annidato | No | No |
Proprietà | Non applicabile | La regola di sistema dei tipi comuni è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature. Vedere la nota 2 di seguito. |
Hide-by-name-and-signature considera tutte le parti della firma, inclusi modificatori personalizzati, tipi restituiti, tipi di parametro, sentinel e convenzioni di chiamata non gestite. Si tratta di un confronto binario.
Per la reflection, le proprietà e gli eventi sono hide-by-name-and-signature. Se si dispone di una proprietà con una funzione di accesso get e una funzione di accesso set nella classe di base, ma la classe derivata ha solo una funzione di accesso get, la proprietà della classe derivata nasconde la proprietà della classe base e non sarà possibile accedere al setter nella classe di base.
Gli attributi personalizzati non fanno parte del sistema di tipi comune.
Le matrici o i tipi COM non vengono cercati a meno che non siano già stati caricati nella tabella delle classi disponibili.
typeName
può essere il nome del tipo qualificato dal relativo spazio dei nomi o un nome completo di assembly che include una specifica del nome dell'assembly. Vedere AssemblyQualifiedName.
Se include lo spazio dei nomi ma non il nome dell'assembly, questo metodo cerca solo typeName
l'assembly dell'oggetto chiamante e mscorlib.dll/System.Private.CoreLib.dll, in questo ordine. Se typeName è completo con il nome parziale o completo dell'assembly, questo metodo esegue la ricerca nell'assembly specificato. Se l'assembly ha un nome sicuro, è necessario un nome di assembly completo.
La AssemblyQualifiedName proprietà restituisce un nome di tipo completo, inclusi i tipi annidati, il nome dell'assembly e gli argomenti generici. Tutti i compilatori che supportano Common Language Runtime generano il nome semplice di una classe annidata e la reflection costruisce un nome non modificato quando viene eseguita una query, in base alle convenzioni seguenti.
Nota
Nella versione .NET Framework 2.0, l'architettura del processore viene aggiunta all'identità dell'assembly e può essere specificata come parte delle stringhe del nome dell'assembly. Ad esempio, "ProcessorArchitecture=msil". Tuttavia, non è incluso nella stringa restituita dalla proprietà , per AssemblyQualifiedName motivi di compatibilità. È anche possibile caricare i tipi creando AssemblyName un oggetto e passandolo a un overload appropriato del Load metodo . È quindi possibile usare il Assembly.GetType metodo per caricare i tipi dall'assembly. Vedere anche AssemblyName.ProcessorArchitecture.
Delimitatore | Significato |
---|---|
Barra rovesciata (\) | Carattere di escape. |
Backtick (') | Precede una o più cifre che rappresentano il numero di parametri di tipo, posizionati alla fine del nome di un tipo generico. |
Parentesi quadre ([]) | Racchiudere un elenco di argomenti di tipo generico per un tipo generico costruito; All'interno di un elenco di argomenti di tipo, racchiudere un tipo qualificato dall'assembly. |
Virgola (,) | Precede il nome dell'assembly. |
Punto (.) | Indica gli identificatori dello spazio dei nomi. |
Segno più (+) | Precede una classe annidata. |
Ad esempio, il nome completo di una classe potrebbe essere simile al seguente:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
Se lo spazio dei nomi fosse TopNamespace.Sub+Namespace, la stringa deve precedere il segno più (+) con un carattere di escape ( ) per impedirne l'interpretazione come separatore di \ annidamento. La reflection genera questa stringa come segue:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
"++" diventa " \ + \ +" e " \ " diventa " \ \ ".
Questo nome completo può essere salvato in modo permanente e successivamente usato per caricare Type . Per cercare e caricare un oggetto , usare solo con il nome del tipo o con il nome di Type GetType tipo completo dell'assembly. GetType con il nome del tipo verrà cercata solo nell'assembly del chiamante Type e quindi nell'assembly system. GetType con il nome di tipo completo dell'assembly verrà cercata Type in qualsiasi assembly.
I nomi dei tipi possono includere caratteri finali che indicano informazioni aggiuntive sul tipo, ad esempio se il tipo è un tipo riferimento, un tipo puntatore o un tipo matrice. Per recuperare il nome del tipo senza questi caratteri finali, usare t.GetElementType().ToString()
, dove è il t
tipo.
Gli spazi sono rilevanti in tutti i componenti del nome del tipo, ad eccezione del nome dell'assembly. Nel nome dell'assembly gli spazi prima del separatore ',' sono rilevanti, ma gli spazi dopo il separatore ',' vengono ignorati.
Il nome di un tipo generico termina con un backtick ( ) seguito da cifre che ` rappresentano il numero di argomenti di tipo generico. Lo scopo di questo mangling dei nomi è consentire ai compilatori di supportare tipi generici con lo stesso nome ma con numeri diversi di parametri di tipo, che si verificano nello stesso ambito. Ad esempio, la reflection restituisce i nomi mangled e dai metodi Tuple`1
Tuple`2
generici Tuple(Of T)
e in Visual Basic o e in Visual Tuple(Of T0, T1)
Tuple<T>
Tuple<T0, T1>
C#.
Per i tipi generici, l'elenco di argomenti di tipo è racchiuso tra parentesi e gli argomenti di tipo sono separati da virgole. Ad esempio, un generico Dictionary<TKey,TValue> ha due parametri di tipo. Un Dictionary<TKey,TValue> oggetto con chiavi di tipo può essere rappresentato come MyType
String segue:
System.Collections.Generic.Dictionary`2[System.String,MyType]
Per specificare un tipo qualificato dall'assembly all'interno di un elenco di argomenti di tipo, racchiudere il tipo qualificato dall'assembly tra parentesi quadre. In caso contrario, le virgole che separano le parti del nome completo dell'assembly vengono interpretate come argomenti di tipo aggiuntivi. Ad esempio, un oggetto di MyAssembly.dll, con chiavi di Dictionary<TKey,TValue> tipo , può essere specificato come MyType
String segue:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
Nota
Un tipo qualificato dall'assembly può essere racchiuso tra parentesi quadre solo quando viene visualizzato all'interno di un elenco di parametri di tipo. Le regole per la ricerca di tipi qualificati e non qualificati negli elenchi di parametri di tipo sono le stesse regole per i tipi non qualificati e non qualificati.
I tipi nullable sono un caso speciale di tipi generici. Ad esempio, un nullable Int32 è rappresentato dalla stringa "System.Nullable'1[System.Int32]".
Nota
In C#, C++ e Visual Basic è anche possibile ottenere tipi nullable usando gli operatori di tipo. Ad esempio, il tipo nullable viene restituito da Boolean typeof(Nullable<bool>)
in C#, da Nullable<Boolean>::typeid
in C++ e da GetType(Nullable(Of Boolean))
in Visual Basic.
Nella tabella seguente viene illustrata la sintassi utilizzata GetType
con per vari tipi.
Ottenere | Uso |
---|---|
Oggetto nullable Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Puntatore non gestito a MyType |
Type.GetType("MyType*") |
Puntatore non gestito a un puntatore a MyType |
Type.GetType("MyType**") |
Puntatore gestito o riferimento a MyType |
Type.GetType("MyType&") . Si noti che, a differenza dei puntatori, i riferimenti sono limitati a un solo livello. |
Una classe padre e una classe annidata | Type.GetType("MyParentClass+MyNestedClass") |
Matrice unidimensionale con limite inferiore di 0 | Type.GetType("MyArray[]") |
Matrice unidimensionale con limite inferiore sconosciuto | Type.GetType("MyArray[*]") |
Matrice n-dimensionale | Una virgola (,) tra parentesi quadre per un totale di n-1 volte. Ad esempio, System.Object[,,] rappresenta una matrice Object tridimensionale. |
Matrice di una matrice bidimensionale | Type.GetType("MyArray[][]") |
Matrice bidimensionale rettangolare con limiti inferiori sconosciuti | Type.GetType("MyArray[,]") |
Tipo generico con un argomento di tipo | Type.GetType("MyGenericType`1[MyType]") |
Tipo generico con due argomenti di tipo | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
Tipo generico con due argomenti di tipo qualificati dall'assembly | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
Tipo generico qualificato dall'assembly con un argomento di tipo qualificato dall'assembly | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
Tipo generico il cui argomento di tipo è un tipo generico con due argomenti di tipo | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |
Vedi anche
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- Specifica di nomi di tipo completi
Si applica a
GetType(String, Boolean, Boolean)
Ottiene l'oggetto Type con il nome specificato, che indica se generare un'eccezione quando viene trovato il tipo e se eseguire una ricerca con distinzione tra maiuscole e minuscole.
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError, bool ignoreCase);
public static Type GetType (string typeName, bool throwOnError, bool ignoreCase);
public static Type? GetType (string typeName, bool throwOnError, bool ignoreCase);
static member GetType : string * bool * bool -> Type
Public Shared Function GetType (typeName As String, throwOnError As Boolean, ignoreCase As Boolean) As Type
Parametri
- typeName
- String
Nome qualificato dall'assembly del tipo da ottenere. Vedere AssemblyQualifiedName. Se il tipo è incluso nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, è sufficiente specificare il nome del tipo qualificato in base al relativo spazio dei nomi.
- throwOnError
- Boolean
true
per generare un'eccezione se non è possibile trovare il tipo; false
per restituire null
. Se si specifica false
vengono eliminate alcune condizioni di eccezione, ma non tutte. Vedere la sezione relativa alle eccezioni.
- ignoreCase
- Boolean
true
per eseguire una ricerca di typeName
senza distinzione tra maiuscole minuscole, false
per eseguire una ricerca di typeName
con distinzione tra maiuscole e minuscole.
Restituisce
Tipo con il nome specificato. Se il tipo non viene trovato, il parametro throwOnError
specifica se viene restituito null
o se viene generata un'eccezione. In alcuni casi, viene generata un'eccezione indipendentemente dal valore di throwOnError
. Vedere la sezione relativa alle eccezioni.
Eccezioni
typeName
è null
.
Viene richiamato un inizializzatore di classi e viene generata un'eccezione.
throwOnError
è true
e il tipo non è stato trovato.
-oppure-
throwOnError
è true
e typeName
contiene caratteri non validi, ad esempio una scheda incorporata.
-oppure-
throwOnError
è true
e typeName
è una stringa vuota.
-oppure-
throwOnError
è true
e typeName
rappresenta un tipo di matrice con una dimensione non valida.
-oppure-
typeName
rappresenta una matrice di TypedReference.
throwOnError
è true
e la sintassi di typeName
non è valida. Ad esempio: "MyType[,*,]".
-oppure-
typeName
rappresenta un tipo generico che ha un tipo di puntatore, un tipo ByRef
o Void tra i relativi argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico che ha un numero errato di argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico e uno dei relativi argomenti di tipo non soddisfa i vincoli per il parametro di tipo corrispondente.
throwOnError
è true
e l'assembly o una delle sue dipendenze non è stato trovato.
L'assembly o una delle relative dipendenze è stato trovato, ma non può essere caricato.
L'assembly o una delle relative dipendenze non è valido.
-oppure-
Attualmente è caricata la versione 2.0 o successiva di Common Language Runtime e l'assembly è stato compilato con una versione successiva.
Commenti
È possibile usare il metodo per ottenere un oggetto per un tipo in un altro assembly se si conosce il nome completo dell'assembly, che GetType può essere ottenuto da Type AssemblyQualifiedName . GetType causa il caricamento dell'assembly specificato in typeName
. È anche possibile caricare un assembly usando Assembly.Load il metodo e quindi usare il metodo o per ottenere oggetti Assembly.GetType Assembly.GetTypes Type . Se un tipo si trova in un assembly noto al programma in fase di compilazione, è più efficiente usare in C# o typeof
l'operatore GetType
in Visual Basic.
GetType
funziona solo sugli assembly caricati dal disco. Se si chiama per cercare un tipo definito in un assembly dinamico definito tramite i servizi, è possibile che si GetType
System.Reflection.Emit otterrà un comportamento incoerente. Il comportamento dipende dal fatto che l'assembly dinamico sia persistente, cio' creato usando le modalità di accesso RunAndSave
o Save
System.Reflection.Emit.AssemblyBuilderAccess dell'enumerazione . Se l'assembly dinamico è persistente ed è stato scritto su disco prima della chiamata, il caricatore trova l'assembly salvato su disco, carica l'assembly e recupera il tipo GetType
da tale assembly. Se l'assembly non è stato salvato su disco quando GetType
viene chiamato, il metodo restituisce null
. GetType
non comprende gli assembly dinamici temporanei; Pertanto, la GetType
chiamata a per recuperare un tipo in un assembly dinamico temporaneo restituisce null
.
Per usare GetType
in un modulo dinamico, sottoscrivere l'evento AppDomain.AssemblyResolve e chiamare prima di GetType
salvare. In caso contrario, si otterrà due copie dell'assembly in memoria.
Il parametro specifica cosa accade quando il tipo non viene trovato ed elimina anche determinate altre condizioni di eccezione, come descritto throwOnError
nella sezione Eccezioni. Alcune eccezioni vengono generate indipendentemente dal valore di throwOnError
. Ad esempio, se il tipo viene trovato ma non può essere caricato, viene generata TypeLoadException un'eccezione anche se è throwOnError
false
.
Nella tabella seguente vengono illustrati i membri di una classe di base restituiti dai Get
metodi quando si esegue la riflessione su un tipo.
Tipo di membro | Static | Non statico |
---|---|---|
Costruttore | No | No |
Campo | No | Sì. Un campo è sempre hide-by-name-and-signature. |
Evento | Non applicabile | La regola di sistema dei tipi comune è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature. Vedere la nota 2 riportata di seguito. |
Metodo | No | Sì. Un metodo (virtuale e non virtuale) può essere hide-by-name o hide-by-name-and-signature. |
Tipo annidato | No | No |
Proprietà | Non applicabile | La regola di sistema dei tipi comune è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature. Vedere la nota 2 riportata di seguito. |
Hide-by-name-and-signature considera tutte le parti della firma, inclusi modificatori personalizzati, tipi restituiti, tipi di parametro, sentinel e convenzioni di chiamata non gestite. Si tratta di un confronto binario.
Per la reflection, le proprietà e gli eventi sono hide-by-name-and-signature. Se si dispone di una proprietà con una funzione di accesso get e una funzione di accesso set nella classe di base, ma la classe derivata ha solo una funzione di accesso get, la proprietà della classe derivata nasconde la proprietà della classe di base e non sarà possibile accedere al setter nella classe di base.
Gli attributi personalizzati non fanno parte del sistema di tipi comune.
Le matrici o i tipi COM non vengono cercati a meno che non siano già stati caricati nella tabella delle classi disponibili.
typeName
può essere il nome del tipo qualificato dal relativo spazio dei nomi o un nome completo di assembly che include una specifica del nome dell'assembly. Vedere AssemblyQualifiedName.
Se include lo spazio dei nomi ma non il nome dell'assembly, questo metodo cerca solo l'assembly dell'oggetto chiamante e mscorlib.dlltypeName
/System.Private.CoreLib.dll, in tale ordine. Se typeName è completo con il nome di assembly parziale o completo, questo metodo cerca nell'assembly specificato. Se l'assembly ha un nome sicuro, è necessario un nome di assembly completo.
La AssemblyQualifiedName proprietà restituisce un nome di tipo completo, inclusi i tipi annidati, il nome dell'assembly e gli argomenti di tipo. Tutti i compilatori che supportano Common Language Runtime emetteranno il nome semplice di una classe annidata e la reflection costruisce un nome mangled quando viene eseguita una query, in base alle convenzioni seguenti.
Nota
Nella versione .NET Framework 2.0, l'architettura del processore viene aggiunta all'identità dell'assembly e può essere specificata come parte delle stringhe del nome dell'assembly. Ad esempio, "ProcessorArchitecture=msil". Tuttavia, non è incluso nella stringa restituita dalla proprietà , per AssemblyQualifiedName motivi di compatibilità. È anche possibile caricare i tipi creando AssemblyName un oggetto e passandolo a un overload appropriato del Load metodo . È quindi possibile usare il Assembly.GetType metodo per caricare i tipi dall'assembly. Vedere anche AssemblyName.ProcessorArchitecture.
Delimitatore | Significato |
---|---|
Barra rovesciata (\) | Carattere di escape. |
Backtick (') | Precede una o più cifre che rappresentano il numero di parametri di tipo, che si trovano alla fine del nome di un tipo generico. |
Parentesi quadre ([]) | Racchiudere un elenco di argomenti di tipo generico per un tipo generico costruito. All'interno di un elenco di argomenti di tipo, racchiudere un tipo completo di assembly. |
Virgola (,) | Precede il nome dell'assembly. |
Punto (.) | Indica gli identificatori dello spazio dei nomi. |
Segno più (+) | Precede una classe annidata. |
Ad esempio, il nome completo per una classe potrebbe essere simile al seguente:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
Se lo spazio dei nomi fosse TopNamespace.Sub+Namespace, la stringa deve precedere il segno più (+) con un carattere di escape ( ) per impedirne l'interpretazione come separatore di \ annidamento. La reflection genera questa stringa nel modo seguente:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
"++" diventa " \ + \ +" e " \ " diventa " \ \ ".
Questo nome completo può essere salvato in modo permanente e successivamente usato per caricare Type . Per cercare e caricare un oggetto , usare solo con il nome del tipo o con il nome di Type GetType tipo completo dell'assembly. GetType con il nome del tipo verrà cercata solo nell'assembly del chiamante Type e quindi nell'assembly system. GetType con il nome di tipo completo dell'assembly verrà cercata Type in qualsiasi assembly.
I nomi dei tipi possono includere caratteri finali che indicano informazioni aggiuntive sul tipo, ad esempio se il tipo è un tipo riferimento, un tipo puntatore o un tipo matrice. Per recuperare il nome del tipo senza questi caratteri finali, usare t.GetElementType().ToString()
, dove è il t
tipo.
Gli spazi sono rilevanti in tutti i componenti del nome del tipo, ad eccezione del nome dell'assembly. Nel nome dell'assembly gli spazi prima del separatore ',' sono rilevanti, ma gli spazi dopo il separatore ',' vengono ignorati.
Il nome di un tipo generico termina con un backtick ( ) seguito da cifre che ` rappresentano il numero di argomenti di tipo generico. Lo scopo di questo mangling dei nomi è consentire ai compilatori di supportare tipi generici con lo stesso nome ma con numeri diversi di parametri di tipo, che si verificano nello stesso ambito. Ad esempio, la reflection restituisce i nomi mangled e dai metodi Tuple`1
Tuple`2
generici Tuple(Of T)
e in Visual Basic o e in Visual Tuple(Of T0, T1)
Tuple<T>
Tuple<T0, T1>
C#.
Per i tipi generici, l'elenco di argomenti di tipo è racchiuso tra parentesi e gli argomenti di tipo sono separati da virgole. Ad esempio, un generico Dictionary<TKey,TValue> ha due parametri di tipo. Un Dictionary<TKey,TValue> oggetto con chiavi di tipo può essere rappresentato come MyType
String segue:
System.Collections.Generic.Dictionary`2[System.String,MyType]
Per specificare un tipo qualificato dall'assembly all'interno di un elenco di argomenti di tipo, racchiudere il tipo qualificato dall'assembly tra parentesi quadre. In caso contrario, le virgole che separano le parti del nome completo dell'assembly vengono interpretate come argomenti di tipo aggiuntivi. Ad esempio, un oggetto di da MyAssembly.dll, con chiavi di Dictionary<TKey,TValue> tipo , può essere specificato come MyType
String segue:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
Nota
Un tipo qualificato dall'assembly può essere racchiuso tra parentesi quadre solo quando viene visualizzato all'interno di un elenco di parametri di tipo. Le regole per la ricerca di tipi qualificati e non qualificati negli elenchi di parametri di tipo sono le stesse regole per i tipi non qualificati e non qualificati.
I tipi nullable sono un caso speciale di tipi generici. Ad esempio, un nullable Int32 è rappresentato dalla stringa "System.Nullable'1[System.Int32]".
Nota
In C#, C++ e Visual Basic è anche possibile ottenere tipi nullable usando gli operatori di tipo. Ad esempio, il tipo nullable viene restituito da Boolean typeof(Nullable<bool>)
in C#, da Nullable<Boolean>::typeid
in C++ e da GetType(Nullable(Of Boolean))
in Visual Basic.
Nella tabella seguente viene illustrata la sintassi utilizzata GetType
con per vari tipi.
Ottenere | Uso |
---|---|
Oggetto nullable Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Puntatore non gestito a MyType |
Type.GetType("MyType*") |
Puntatore non gestito a un puntatore a MyType |
Type.GetType("MyType**") |
Puntatore gestito o riferimento a MyType |
Type.GetType("MyType&") . Si noti che, a differenza dei puntatori, i riferimenti sono limitati a un solo livello. |
Una classe padre e una classe annidata | Type.GetType("MyParentClass+MyNestedClass") |
Matrice unidimensionale con limite inferiore di 0 | Type.GetType("MyArray[]") |
Matrice unidimensionale con limite inferiore sconosciuto | Type.GetType("MyArray[*]") |
Matrice n-dimensionale | Una virgola (,) tra parentesi quadre per un totale di n-1 volte. Ad esempio, System.Object[,,] rappresenta una matrice Object tridimensionale. |
Matrice di una matrice bidimensionale | Type.GetType("MyArray[][]") |
Matrice bidimensionale rettangolare con limiti inferiori sconosciuti | Type.GetType("MyArray[,]") |
Tipo generico con un argomento di tipo | Type.GetType("MyGenericType`1[MyType]") |
Tipo generico con due argomenti di tipo | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
Tipo generico con due argomenti di tipo qualificati dall'assembly | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
Tipo generico qualificato dall'assembly con un argomento di tipo qualificato dall'assembly | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
Tipo generico il cui argomento di tipo è un tipo generico con due argomenti di tipo | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |
Vedi anche
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- Specifica di nomi di tipo completi
Si applica a
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>)
Ottiene il tipo con il nome specificato, fornendo facoltativamente metodi personalizzati per risolvere l'assembly e il tipo.
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver);
public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver);
public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver);
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type)) As Type
Parametri
- typeName
- String
Nome del tipo da ottenere. Se viene fornito il parametro typeResolver
, il nome del tipo può essere qualsiasi stringa che typeResolver
è in grado di risolvere. Se viene fornito il parametro assemblyResolver
o se viene usata la risoluzione del tipo standard, typeName
deve essere un nome qualificato dall'assembly (vedere AssemblyQualifiedName), a meno che il tipo non si trovi nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, nel qual caso è sufficiente fornire il nome del tipo completo di spazio dei nomi.
- assemblyResolver
- Func<AssemblyName,Assembly>
Metodo che individua e restituisce l'assembly specificato in typeName
. Il nome dell'assembly viene passato a assemblyResolver
come oggetto AssemblyName. Se typeName
non contiene il nome di un assembly, assemblyResolver
non viene chiamato. Se assemblyResolver
non viene fornito, viene eseguita la risoluzione dell'assembly standard.
Attenzione Non passare metodi da chiamanti non noti o non attendibili. In caso contrario, potrebbe verificarsi un'elevazione di privilegi per codice dannoso. Usare solo i metodi forniti o con cui si ha dimestichezza.
Metodo che individua e restituisce il tipo specificato da typeName
dall'assembly restituito da assemblyResolver
o dalla risoluzione dell'assembly standard. Se non viene fornito alcun assembly, il metodo typeResolver
può fornirne uno. Il metodo accetta inoltre un parametro che specifica se eseguire una ricerca senza fare distinzione tra maiuscole e minuscole. false
viene passato al parametro.
Attenzione Non passare metodi da chiamanti non noti o non attendibili.
Restituisce
Tipo con il nome specificato, oppure null
se il tipo non viene trovato.
Eccezioni
typeName
è null
.
Viene richiamato un inizializzatore di classi e viene generata un'eccezione.
Si verifica un errore quando typeName
viene analizzato in un nome di tipo e un nome di assembly (ad esempio, quando il nome di tipo semplice include un carattere speciale senza escape).
-oppure-
typeName
rappresenta un tipo generico che ha un tipo di puntatore, un tipo ByRef
o Void tra i relativi argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico che ha un numero errato di argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico e uno dei relativi argomenti di tipo non soddisfa i vincoli per il parametro di tipo corrispondente.
typeName
rappresenta una matrice di TypedReference.
L'assembly o una delle relative dipendenze è stato trovato, ma non può essere caricato.
-oppure-
typeName
contiene un nome di assembly non valido.
-oppure-
typeName
è un nome di assembly valido senza un nome di tipo.
L'assembly o una delle relative dipendenze non è valido.
-oppure-
L'assembly è stato compilato con una versione successiva di Common Language Runtime rispetto alla versione attualmente caricata.
Commenti
Gli scenari di utilizzo per questo metodo e i dettagli sui assemblyResolver
parametri e sono disponibili typeResolver
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) nell'overload del metodo .
Nota
Se typeName
non è possibile trovare , la chiamata al metodo restituisce GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) null
. Non genera un'eccezione. Per controllare se viene generata un'eccezione, chiamare un overload del GetType metodo con un parametro throwOnError
.
La chiamata a questo overload del metodo è identica alla chiamata dell'overload del metodo GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) e alla specifica dei parametri e false
throwOnError
ignoreCase
.
Si applica a
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)
Ottiene il tipo con il nome specificato, indicando se generare un'eccezione se il tipo non viene trovato e fornendo facoltativamente metodi personalizzati per risolvere l'assembly e il tipo.
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError);
public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError);
public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError);
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean) As Type
Parametri
- typeName
- String
Nome del tipo da ottenere. Se viene fornito il parametro typeResolver
, il nome del tipo può essere qualsiasi stringa che typeResolver
è in grado di risolvere. Se viene fornito il parametro assemblyResolver
o se viene usata la risoluzione del tipo standard, typeName
deve essere un nome qualificato dall'assembly (vedere AssemblyQualifiedName), a meno che il tipo non si trovi nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, nel qual caso è sufficiente fornire il nome del tipo completo di spazio dei nomi.
- assemblyResolver
- Func<AssemblyName,Assembly>
Metodo che individua e restituisce l'assembly specificato in typeName
. Il nome dell'assembly viene passato a assemblyResolver
come oggetto AssemblyName. Se typeName
non contiene il nome di un assembly, assemblyResolver
non viene chiamato. Se assemblyResolver
non viene fornito, viene eseguita la risoluzione dell'assembly standard.
Attenzione Non passare metodi da chiamanti non noti o non attendibili. In caso contrario, potrebbe verificarsi un'elevazione di privilegi per codice dannoso. Usare solo i metodi forniti o con cui si ha dimestichezza.
Metodo che individua e restituisce il tipo specificato da typeName
dall'assembly restituito da assemblyResolver
o dalla risoluzione dell'assembly standard. Se non viene fornito alcun assembly, il metodo può fornirne uno. Il metodo accetta inoltre un parametro che specifica se eseguire una ricerca senza fare distinzione tra maiuscole e minuscole. false
viene passato al parametro.
Attenzione Non passare metodi da chiamanti non noti o non attendibili.
- throwOnError
- Boolean
true
per generare un'eccezione se non è possibile trovare il tipo; false
per restituire null
. Se si specifica false
vengono eliminate alcune condizioni di eccezione, ma non tutte. Vedere la sezione relativa alle eccezioni.
Restituisce
Tipo con il nome specificato. Se il tipo non viene trovato, il parametro throwOnError
specifica se viene restituito null
o se viene generata un'eccezione. In alcuni casi, viene generata un'eccezione indipendentemente dal valore di throwOnError
. Vedere la sezione relativa alle eccezioni.
Eccezioni
typeName
è null
.
Viene richiamato un inizializzatore di classi e viene generata un'eccezione.
throwOnError
è true
e il tipo non è stato trovato.
-oppure-
throwOnError
è true
e typeName
contiene caratteri non validi, ad esempio una scheda incorporata.
-oppure-
throwOnError
è true
e typeName
è una stringa vuota.
-oppure-
throwOnError
è true
e typeName
rappresenta un tipo di matrice con una dimensione non valida.
-oppure-
typeName
rappresenta una matrice di TypedReference.
Si verifica un errore quando typeName
viene analizzato in un nome di tipo e un nome di assembly (ad esempio, quando il nome di tipo semplice include un carattere speciale senza escape).
-oppure-
throwOnError
è true
e typeName
contiene sintassi non valida (ad esempio, "MyType[,*,]").
-oppure-
typeName
rappresenta un tipo generico che ha un tipo di puntatore, un tipo ByRef
o Void tra i relativi argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico che ha un numero errato di argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico e uno dei relativi argomenti di tipo non soddisfa i vincoli per il parametro di tipo corrispondente.
throwOnError
è true
e l'assembly o una delle sue dipendenze non è stato trovato.
-oppure-
typeName
contiene un nome di assembly non valido.
-oppure-
typeName
è un nome di assembly valido senza un nome di tipo.
L'assembly o una delle relative dipendenze è stato trovato, ma non può essere caricato.
L'assembly o una delle relative dipendenze non è valido.
-oppure-
L'assembly è stato compilato con una versione successiva di Common Language Runtime rispetto alla versione attualmente caricata.
Commenti
Gli scenari di utilizzo per questo metodo e i dettagli sui assemblyResolver
parametri e sono disponibili typeResolver
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) nell'overload del metodo .
La chiamata a questo overload del metodo è identica alla chiamata dell'overload del metodo GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) e alla specifica del parametro false
ignoreCase
.
Si applica a
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)
Ottiene il tipo con il nome specificato, indicando se eseguire una ricerca facendo distinzione tra maiuscole e minuscole e se generare un'eccezione se il tipo non viene trovato e fornendo facoltativamente metodi personalizzati per risolvere l'assembly e il tipo.
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError, bool ignoreCase);
public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError, bool ignoreCase);
public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError, bool ignoreCase);
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool * bool -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean, ignoreCase As Boolean) As Type
Parametri
- typeName
- String
Nome del tipo da ottenere. Se viene fornito il parametro typeResolver
, il nome del tipo può essere qualsiasi stringa che typeResolver
è in grado di risolvere. Se viene fornito il parametro assemblyResolver
o se viene usata la risoluzione del tipo standard, typeName
deve essere un nome qualificato dall'assembly (vedere AssemblyQualifiedName), a meno che il tipo non si trovi nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, nel qual caso è sufficiente fornire il nome del tipo completo di spazio dei nomi.
- assemblyResolver
- Func<AssemblyName,Assembly>
Metodo che individua e restituisce l'assembly specificato in typeName
. Il nome dell'assembly viene passato a assemblyResolver
come oggetto AssemblyName. Se typeName
non contiene il nome di un assembly, assemblyResolver
non viene chiamato. Se assemblyResolver
non viene fornito, viene eseguita la risoluzione dell'assembly standard.
Attenzione Non passare metodi da chiamanti non noti o non attendibili. In caso contrario, potrebbe verificarsi un'elevazione di privilegi per codice dannoso. Usare solo i metodi forniti o con cui si ha dimestichezza.
Metodo che individua e restituisce il tipo specificato da typeName
dall'assembly restituito da assemblyResolver
o dalla risoluzione dell'assembly standard. Se non viene fornito alcun assembly, il metodo può fornirne uno. Il metodo accetta inoltre un parametro che specifica se eseguire una ricerca senza fare distinzione tra maiuscole e minuscole. Il valore di ignoreCase
viene passato al parametro.
Attenzione Non passare metodi da chiamanti non noti o non attendibili.
- throwOnError
- Boolean
true
per generare un'eccezione se non è possibile trovare il tipo; false
per restituire null
. Se si specifica false
vengono eliminate alcune condizioni di eccezione, ma non tutte. Vedere la sezione relativa alle eccezioni.
- ignoreCase
- Boolean
true
per eseguire una ricerca di typeName
senza distinzione tra maiuscole minuscole, false
per eseguire una ricerca di typeName
con distinzione tra maiuscole e minuscole.
Restituisce
Tipo con il nome specificato. Se il tipo non viene trovato, il parametro throwOnError
specifica se viene restituito null
o se viene generata un'eccezione. In alcuni casi, viene generata un'eccezione indipendentemente dal valore di throwOnError
. Vedere la sezione relativa alle eccezioni.
Eccezioni
typeName
è null
.
Viene richiamato un inizializzatore di classi e viene generata un'eccezione.
throwOnError
è true
e il tipo non è stato trovato.
-oppure-
throwOnError
è true
e typeName
contiene caratteri non validi, ad esempio una scheda incorporata.
-oppure-
throwOnError
è true
e typeName
è una stringa vuota.
-oppure-
throwOnError
è true
e typeName
rappresenta un tipo di matrice con una dimensione non valida.
-oppure-
typeName
rappresenta una matrice di TypedReference.
Si verifica un errore quando typeName
viene analizzato in un nome di tipo e un nome di assembly (ad esempio, quando il nome di tipo semplice include un carattere speciale senza escape).
-oppure-
throwOnError
è true
e typeName
contiene sintassi non valida (ad esempio, "MyType[,*,]").
-oppure-
typeName
rappresenta un tipo generico che ha un tipo di puntatore, un tipo ByRef
o Void tra i relativi argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico che ha un numero errato di argomenti di tipo.
-oppure-
typeName
rappresenta un tipo generico e uno dei relativi argomenti di tipo non soddisfa i vincoli per il parametro di tipo corrispondente.
throwOnError
è true
e l'assembly o una delle sue dipendenze non è stato trovato.
L'assembly o una delle relative dipendenze è stato trovato, ma non può essere caricato.
-oppure-
typeName
contiene un nome di assembly non valido.
-oppure-
typeName
è un nome di assembly valido senza un nome di tipo.
L'assembly o una delle relative dipendenze non è valido.
-oppure-
L'assembly è stato compilato con una versione successiva di Common Language Runtime rispetto alla versione attualmente caricata.
Commenti
Usare questo overload del metodo e gli overload associati ( e ) per sostituire l'implementazione predefinita del GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean) metodo con GetType implementazioni più flessibili. Fornendo metodi personalizzati che risolvono i nomi dei tipi e i nomi degli assembly che li contengono, è possibile eseguire le operazioni seguenti:
Controllare la versione di un assembly da cui viene caricato un tipo.
Specificare un'altra posizione in cui cercare un nome di tipo che non include un nome di assembly.
Caricare gli assembly usando nomi di assembly parziali.
Restituisce sottoclassi System.Type di che non vengono create da Common Language Runtime (CLR).
Ad esempio, nella serializzazione a tolleranza di versione questo metodo consente di cercare un assembly "best fit" usando un nome parziale. Altri overload del metodo GetType richiedono un nome di tipo completo di assembly, che include il numero di versione.
Le implementazioni alternative del sistema di tipi potrebbero dover restituire sottoclassi di che non vengono create da CLR. Tutti i tipi restituiti da altri overload del metodo sono tipi System.Type GetType di runtime.
Note sull'utilizzo
Questo overload del metodo e gli overload associati analizzano il nome di un tipo e il nome di un typeName
assembly e quindi risolvono i nomi. La risoluzione del nome dell'assembly viene eseguita prima della risoluzione del nome del tipo, perché un nome di tipo deve essere risolto nel contesto di un assembly.
Nota
Se non si ha familiarità con il concetto di nomi di tipo qualificati dall'assembly, vedere la AssemblyQualifiedName proprietà .
Se typeName
non è un nome completo di assembly, la risoluzione dell'assembly viene ignorata. I nomi dei tipi non qualificati possono essere risolti nel contesto di mscorlib.dll/System.Private.CoreLib.dll o dell'assembly attualmente in esecuzione oppure facoltativamente è possibile specificare un assembly nel typeResolver
parametro . Gli effetti dell'inclusione o dell'omissione del nome dell'assembly per diversi tipi di risoluzione dei nomi vengono visualizzati come tabella nella sezione Risoluzione dei nomi misti.
Note generali sull'utilizzo:
Non passare metodi a
assemblyResolver
otypeResolver
se provengono da chiamanti sconosciuti o non attendibili. Usare solo i metodi forniti o con cui si ha dimestichezza.Attenzione
L'uso di metodi da chiamanti sconosciuti o non attendibili può comportare l'elevazione dei privilegi per codice dannoso.
Se si omettono i parametri e/o , il valore del parametro viene passato ai metodi
assemblyResolver
typeResolver
chethrowOnError
eseguono la risoluzione predefinita.Se
throwOnError
è , questo metodo generatrue
un'eccezione TypeLoadException quando restituisce e quando restituiscetypeResolver
null
FileNotFoundExceptionassemblyResolver
null
.Questo metodo non intercetta le eccezioni generate da
assemblyResolver
etypeResolver
. L'utente è responsabile di eventuali eccezioni generate dai metodi del sistema di risoluzione.
Risoluzione di assembly
Il metodo riceve un oggetto , generato analizzando il nome assemblyResolver
AssemblyName dell'assembly della stringa incluso in typeName
. Se typeName
non contiene un nome di assembly, non viene chiamato e viene passato a assemblyResolver
null
typeResolver
.
Se non viene specificato, viene usato il assemblyResolver
probe dell'assembly standard per individuare l'assembly. Se viene specificato, il metodo non esegue il probe standard. In tal caso, è necessario assicurarsi che sia in grado di gestire tutti gli assembly assemblyResolver
GetType assemblyResolver
passati.
Il assemblyResolver
metodo deve restituire se null
l'assembly non può essere risolto. Se restituisce , non viene chiamato e non viene eseguita alcuna ulteriore assemblyResolver
null
typeResolver
elaborazione. Inoltre, se throwOnError
è , viene generata true
FileNotFoundException un'eccezione .
Se AssemblyName l'oggetto passato assemblyResolver
a è un nome parziale, una o più parti sono null
. Ad esempio, se non ha alcuna versione, la Version proprietà è null
. Se la proprietà , la proprietà e il metodo restituiscono tutti , è stato fornito solo il nome semplice Version CultureInfo GetPublicKeyToken null
dell'assembly. Il assemblyResolver
metodo può usare o ignorare tutte le parti del nome dell'assembly.
Gli effetti delle diverse opzioni di risoluzione degli assembly vengono visualizzati come tabella nella sezione Risoluzione dei nomi misti per i nomi di tipo semplici e qualificati dall'assembly.
Risoluzione dei tipi
Se typeName
non specifica un nome di assembly, viene sempre chiamato typeResolver
. Se typeName
specifica un nome di assembly, viene chiamato solo quando il nome typeResolver
dell'assembly viene risolto correttamente. Se assemblyResolver
o il probe dell'assembly standard restituisce , non viene chiamato null
typeResolver
.
Il typeResolver
metodo riceve tre argomenti:
Assembly in cui eseguire la ricerca
null
o se non contiene un nome ditypeName
assembly.Nome semplice del tipo. Nel caso di un tipo annidato, si tratta del tipo più esterno che lo contiene. Nel caso di un tipo generico, si tratta del nome semplice del tipo generico.
Valore booleano che indica se la distinzione tra maiuscole e minuscole
true
dei nomi dei tipi deve essere ignorata.
L'implementazione determina il modo in cui vengono usati questi argomenti. Il typeResolver
metodo deve restituire se non è in grado di risolvere il null
tipo. Se typeResolver
restituisce e è , questo overload di genera null
throwOnError
true
GetType un'eccezione TypeLoadException .
Gli effetti delle diverse opzioni di risoluzione dei tipi vengono visualizzati come tabella nella sezione Risoluzione dei nomi misti per i nomi di tipo semplici e qualificati dall'assembly.
Risoluzione dei tipi annidati
Se typeName
è un tipo annidato, a viene passato solo il nome del tipo più esterno che lo typeResolver
contiene. Quando typeResolver
restituisce questo tipo, il metodo viene chiamato in modo ricorsivo fino a quando non viene risolto il GetNestedType tipo annidato più interno.
Risoluzione dei tipi generici
Viene chiamato in modo ricorsivo per risolvere i tipi generici: prima di tutto per risolvere il tipo generico stesso e quindi GetType per risolvere i relativi argomenti di tipo. Se un argomento di tipo è generico, GetType viene chiamato in modo ricorsivo per risolvere i relativi argomenti di tipo e così via.
La combinazione assemblyResolver
di e specificata deve essere in grado di risolvere tutti i livelli di questa typeResolver
ricorsione. Si supponga, ad esempio, di fornire un assemblyResolver
oggetto che controlla il caricamento di MyAssembly
. Si supponga di voler risolvere il tipo generico Dictionary<string, MyType>
( Dictionary(Of String, MyType)
in Visual Basic). È possibile passare il nome di tipo generico seguente:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
Si noti che MyType
è l'unico argomento di tipo qualificato dall'assembly. I nomi delle classi Dictionary<TKey,TValue> e non sono qualificati String dall'assembly. Deve typeResolver
essere in grado di gestire un assembly o , perché null
riceverà per e null
Dictionary<TKey,TValue> String . Può gestire tale caso chiamando un overload del metodo che accetta una stringa, perché entrambi i nomi di tipo non qualificati si mscorlib.dllGetType /System.Private.CoreLib.dll:
Type t = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : null,
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore)
);
Il metodo non viene chiamato per il tipo di dizionario e il tipo stringa, perché tali nomi di assemblyResolver
tipo non sono qualificati dall'assembly.
Si supponga ora che invece di System.String
, il primo tipo di argomento generico sia , da YourType
YourAssembly
:
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
Poiché questo assembly non è mscorlib.dll/System.Private.CoreLib.dll né l'assembly attualmente in esecuzione, non è possibile risolvere senza un YourType
nome qualificato dall'assembly. Poiché assemblyResolve
verrà chiamato in modo ricorsivo, deve essere in grado di gestire questo caso. Invece di restituire per assembly diversi da , ora esegue null
MyAssembly
un caricamento dell'assembly usando l'oggetto AssemblyName fornito.
Type t2 = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") :
Assembly.Load(aName),
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore), true
);
Tornare alle note sull'utilizzo.
Risoluzione dei nomi dei tipi con caratteri speciali
Alcuni caratteri hanno significati speciali nei nomi completi di assembly. Se un nome di tipo semplice contiene questi caratteri, i caratteri causano errori di analisi quando il nome semplice fa parte di un nome completo di assembly. Per evitare gli errori di analisi, è necessario eseguire l'escape dei caratteri speciali con una barra rovesciata prima di poter passare il nome completo dell'assembly al GetType metodo . Ad esempio, se un tipo è denominato , il carattere di escape deve essere aggiunto prima della parentesi quadra come Strange]Type
segue: Strange\]Type
.
Nota
I nomi con tali caratteri speciali non possono essere creati in Visual Basic o C#, ma possono essere creati usando Microsoft Intermediate Language (MSIL) o emettendo assembly dinamici.
Nella tabella seguente vengono illustrati i caratteri speciali per i nomi dei tipi.
Carattere | Significato |
---|---|
, (virgola) |
Delimitatore per i nomi completi di assembly. |
[] (parentesi quadre) |
Come coppia di suffissi, indica un tipo di matrice. come coppia di delimitatori, racchiude gli elenchi di argomenti generici e i nomi completi di assembly. |
& (e commerciale) |
Come suffisso, indica che un tipo è un tipo riferimento. |
* (asterisco) |
Come suffisso, indica che un tipo è un tipo puntatore. |
+ (più) |
Delimitatore per i tipi annidati. |
\ (barra rovesciata) |
Carattere di escape. |
Proprietà come restituiscono AssemblyQualifiedName stringhe con caratteri di escape corretti. È necessario passare correttamente le stringhe precedute da un carattere di escape al GetType metodo . A sua volta, il GetType metodo passa correttamente i nomi con caratteri di escape a e ai metodi di risoluzione dei tipi typeResolver
predefiniti. Se è necessario confrontare un nome con un nome senza caratteri di escape in typeResolver
, è necessario rimuovere i caratteri di escape.
Tornare alle note sull'utilizzo.
Risoluzione dei nomi misti
Nella tabella seguente vengono riepilogate le interazioni tra , e la risoluzione dei nomi predefinita per tutte le combinazioni di nome del tipo e nome assemblyResolver
typeResolver
dell'assembly in typeName
:
Contenuto del nome del tipo | Metodo resolver dell'assembly | Metodo del sistema di risoluzione dei tipi | Risultato |
---|---|---|---|
tipo, assembly | Null | Null | Equivale a chiamare Type.GetType(String, Boolean, Boolean) l'overload del metodo . |
tipo, assembly | Fornito | Null | assemblyResolver restituisce l'assembly o restituisce null se non è in grado di risolvere l'assembly. Se l'assembly viene risolto, l'overload del metodo viene utilizzato per caricare il tipo dall'assembly. In caso contrario, non viene eseguito alcun tentativo Assembly.GetType(String, Boolean, Boolean) di risoluzione del tipo. |
tipo, assembly | Null | Fornito | Equivale a convertire il nome dell'assembly in un oggetto e a AssemblyName chiamare Assembly.Load(AssemblyName) l'overload del metodo per ottenere l'assembly. Se l'assembly viene risolto, viene passato a ; in caso contrario, non viene chiamato e non viene eseguito alcun ulteriore tentativo typeResolver typeResolver di risoluzione del tipo. |
tipo, assembly | Fornito | Fornito | assemblyResolver restituisce l'assembly o restituisce null se non è in grado di risolvere l'assembly. Se l'assembly viene risolto, viene passato a ; in caso contrario, non viene chiamato e non viene eseguito alcun ulteriore tentativo typeResolver typeResolver di risoluzione del tipo. |
tipo | null, fornito | Null | Equivale a chiamare Type.GetType(String, Boolean, Boolean) l'overload del metodo . Poiché il nome dell'assembly non viene specificato, viene mscorlib.dllricerca solo mscorlib.dll/System.Private.CoreLib.dll e l'assembly attualmente in esecuzione. Se assemblyResolver viene specificato, viene ignorato. |
tipo | null, fornito | Fornito | typeResolver viene chiamato e null viene passato per l'assembly. typeResolver può fornire un tipo da qualsiasi assembly, inclusi gli assembly caricati per lo scopo. Se assemblyResolver viene specificato, viene ignorato. |
assembly | null, fornito | null, fornito | Viene FileLoadException generata un'eccezione perché il nome dell'assembly viene analizzato come se fosse un nome di tipo qualificato dall'assembly. Il risultato è un nome di assembly non valido. |
Tornare a: Note sull'utilizzo, Risoluzione degli assembly, Risoluzione dei tipi.