Type.GetType Metodo

Definizione

Ottiene un Type oggetto che rappresenta il tipo specificato.

Overload

Nome Descrizione
GetType()

Ottiene l'oggetto corrente Type.

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 se il tipo non viene trovato.

GetType(String, Boolean, Boolean)

Ottiene l'oggetto Type con il nome specificato, specificando se generare un'eccezione se il tipo non viene trovato 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, specificando se generare un'eccezione se il tipo non viene trovato e, facoltativamente, fornendo 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, specificando se eseguire una ricerca con distinzione tra maiuscole e minuscole e se generare un'eccezione se il tipo non viene trovato e, facoltativamente, fornendo metodi personalizzati per risolvere l'assembly e il tipo.

GetType()

Origine:
Type.cs
Origine:
Type.cs
Origine:
Type.cs
Origine:
Type.cs
Origine:
Type.cs

Ottiene l'oggetto corrente Type.

public:
 Type ^ GetType();
public:
 virtual Type ^ GetType();
public Type GetType();
override this.GetType : unit -> Type
Public Function GetType () As Type

Valori restituiti

Oggetto corrente Type.

Implementazioni

Eccezioni

Un inizializzatore di classe viene richiamato e genera un'eccezione.

Vedi anche

Si applica a

GetType(String)

Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs

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);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName);
public static Type? GetType(string typeName);
static member GetType : string -> Type
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string -> Type
Public Shared Function GetType (typeName As String) As Type

Parametri

typeName
String

Nome completo dell'assembly del tipo da ottenere. Vedete AssemblyQualifiedName. Se il tipo si trova nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, è sufficiente specificare il nome del tipo qualificato dal relativo spazio dei nomi.

Valori restituiti

Tipo con il nome specificato, se trovato; in caso contrario, null.

Attributi

Eccezioni

typeName è null.

Un inizializzatore di classe viene richiamato e genera un'eccezione.

typeName rappresenta un tipo generico con un tipo di puntatore, un ByRef tipo o Void come uno dei relativi argomenti di tipo.

oppure

typeName rappresenta un tipo generico con 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 un tipo non valido, ad esempio una matrice di TypedReference.

Impossibile caricare l'assembly o una delle relative dipendenze.

Nota: in .NET per le app dello Store Windows o Portable Class Library, intercettare invece l'eccezione della classe base IOException.

L'assembly non è valido per il runtime attualmente caricato.

Esempio

Nell'esempio seguente viene recuperato il tipo di System.Int32 e viene utilizzato l'oggetto type per visualizzare la FullName proprietà di System.Int32.

using System;

class GetTypeExample
{
     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
open System

try
    // Get the type of a specified class.
    let myType1 = Type.GetType "System.Int32"
    printfn $"The full name is {myType1.FullName}.\n"
with :? TypeLoadException as e ->
    printfn $"{e.GetType().Name}: Unable to load type System.Int32"

try
    // Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
    let myType2 = Type.GetType("NoneSuch", true)
    printfn $"The full name is {myType2.FullName}."
with :? TypeLoadException as e ->
    printfn $"{e.GetType().Name}: Unable to load type NoneSuch"
// 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 utilizzare il GetType metodo per ottenere un Type oggetto per un tipo in un altro assembly se si conosce il nome completo dell'assembly, che può essere ottenuto da AssemblyQualifiedName. GetType causa il caricamento dell'assembly specificato in typeName. È anche possibile caricare un assembly usando il Assembly.Load metodo e quindi usare il Assembly.GetType metodo o Assembly.GetTypes per ottenere Type oggetti. Se un tipo si trova in un assembly noto al programma in fase di compilazione, è più efficiente usare in C# o l'operatore />

Note

Se typeName non è possibile trovare , la chiamata al GetType(String) metodo restituisce null. Non genera un'eccezione. Per controllare se viene generata un'eccezione, chiamare un overload del GetType metodo con un throwOnError parametro .

solo .NET Framework: GetType funziona solo sugli assembly caricati dal disco. Se si chiama GetType per cercare un tipo definito in un assembly dinamico definito usando i System.Reflection.Emit servizi, è possibile che si verifichi un comportamento incoerente. Il comportamento dipende dal fatto che l'assembly dinamico sia persistente, ovvero creato usando le RunAndSave modalità di accesso o Save dell'enumerazione System.Reflection.Emit.AssemblyBuilderAccess . Se l'assembly dinamico è persistente ed è stato scritto su disco prima GetType della chiamata, il caricatore trova l'assembly salvato su disco, carica tale assembly e recupera il tipo 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 chiamata GetType a per recuperare un tipo in un assembly dinamico temporaneo restituisce null.

In .NET Framework, per usare in un modulo dinamico, sottoscrivere l'evento /> prima di salvare. In caso contrario, si otterranno due copie dell'assembly in memoria.

In .NET Core 3.0 e versioni successive, i carichi di assembly attivati da questa API sono interessati dal valore corrente di AssemblyLoadContext.CurrentContextualReflectionContext.

Nella tabella seguente vengono illustrati i membri della classe base restituiti dai Get metodi quando si analizza un tipo.

Tipo di membro Static Non statico
Costruttore No No
Campo No Yes. Un campo è sempre nascosto per nome e firma.
Event 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 di seguito.
metodo No Yes. Un metodo (virtuale e non virtuale) può essere nascosto per nome o nascosto per nome e firma.
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 di seguito.
  1. 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.

  2. In riflessione, le proprietà e gli eventi sono hide-by-name-and-signature. Se si dispone di una proprietà con una funzione di accesso get e set nella classe 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 base.

  3. 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 dallo spazio dei nomi o un nome completo dell'assembly che include una specifica del nome dell'assembly. Vedete AssemblyQualifiedName.

Se typeName include lo spazio dei nomi ma non il nome dell'assembly, questo metodo cerca solo l'assembly dell'oggetto chiamante e mscorlib.dll/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 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 nidificata e la reflection costruisce un nome sbrogliato quando viene eseguita una query, in base alle convenzioni seguenti.

Note

L'architettura del processore fa parte dell'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 AssemblyQualifiedName proprietà, per motivi di compatibilità. È anche possibile caricare i tipi creando un AssemblyName oggetto e passandolo a un overload appropriato del Load metodo . È quindi possibile usare il Assembly.GetType metodo per caricare i tipi dall'assembly. Vedi 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 qualificato dall'assembly.
Virgola (,) Precede il nome dell'assembly.
Punto (.) Indica gli identificatori dello spazio dei nomi.
Segno di addizione (+) Precede una classe nidificata.

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 dovrà precedere il segno più (+) con un carattere di escape (\) per evitare che venga interpretato 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 usato in un secondo momento per caricare .Type Per cercare e caricare un Typeoggetto , usare GetType solo con il nome del tipo o con il nome completo dell'assembly. GetType con il nome del tipo cercherà Type solo nell'assembly del chiamante e quindi nell'assembly di sistema. GetType con il nome del tipo completo dell'assembly cercherà in Type 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 di puntatore o un tipo di matrice. Per recuperare il nome del tipo senza questi caratteri finali, usare t.GetElementType().ToString(), dove t è il 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 del nome è 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 Tuple`1 e Tuple`2 dai metodi generici Tuple(Of T) e Tuple(Of T0, T1) in Visual Basic oppure Tuple<T> e Tuple<T0, T1> in Visual 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> oggetto di MyType con chiavi di tipo String può essere rappresentato nel modo seguente:

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 qualificato dall'assembly vengono interpretate come delimitando 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]]")

Note

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 assembly per tipi qualificati e non qualificati negli elenchi di parametri di tipo sono le stesse delle regole per i tipi non generici qualificati e non qualificati.

I tipi nullable sono un caso speciale di tipi generici. Ad esempio, un valore nullable Int32 è rappresentato dalla stringa "System.Nullable'1[System.Int32]".

Note

È anche possibile ottenere tipi nullable usando operatori di tipo. Ad esempio, il tipo Boolean nullable viene restituito da typeof(Nullable<bool>) in C# e da GetType(Nullable(Of Boolean)) in Visual Basic.

Nella tabella seguente viene illustrata la sintassi usata con GetType per vari tipi.

Ottenere Utilizzo
Un valore 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 livello.
Una classe padre e una classe nidificata Type.GetType("MyParentClass+MyNestedClass")
Matrice unidimensionale con un limite inferiore pari a 0 Type.GetType("MyType[]")
Matrice unidimensionale con un limite inferiore sconosciuto Type.GetType("MyType[*]")
Matrice ndimensionale Una virgola (,) all'interno delle parentesi quadre è un totale di n-1 volte. Ad esempio, System.Object[,,] rappresenta una matrice tridimensionale Object .
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 qualificato 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

Si applica a

GetType(String, Boolean)

Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs

Ottiene l'oggetto Type con il nome specificato, eseguendo una ricerca con distinzione tra maiuscole e minuscole e specificando se generare un'eccezione se il tipo non viene trovato.

public:
 static Type ^ GetType(System::String ^ typeName, bool throwOnError);
public static Type GetType(string typeName, bool throwOnError);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName, bool throwOnError);
public static Type? GetType(string typeName, bool throwOnError);
static member GetType : string * bool -> Type
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * bool -> Type
Public Shared Function GetType (typeName As String, throwOnError As Boolean) As Type

Parametri

typeName
String

Nome completo dell'assembly del tipo da ottenere. Vedete AssemblyQualifiedName. Se il tipo si trova nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, è sufficiente specificare il nome del tipo qualificato dal relativo spazio dei nomi.

throwOnError
Boolean

true per generare un'eccezione se non è possibile trovare il tipo; false per restituire null. Specificando false vengono eliminate anche alcune altre condizioni di eccezione, ma non tutte. Vedere la sezione Eccezioni.

Valori restituiti

Tipo con il nome specificato. Se il tipo non viene trovato, il throwOnError parametro specifica se null viene restituito o se viene generata un'eccezione. In alcuni casi, viene generata un'eccezione indipendentemente dal valore di throwOnError. Vedere la sezione Eccezioni.

Attributi

Eccezioni

typeName è null.

Un inizializzatore di classe viene richiamato e genera un'eccezione.

throwOnError è true e il tipo non viene trovato.

oppure

throwOnError è true e typeName contiene caratteri non validi, ad esempio una scheda incorporata.

oppure

throwOnErrorè e true è 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 typeName contiene una sintassi non valida. Ad esempio, "MyType[,*,]".

oppure

typeName rappresenta un tipo generico con un tipo di puntatore, un ByRef tipo o Void come uno dei relativi argomenti di tipo.

oppure

typeName rappresenta un tipo generico con 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 relative dipendenze non è stata trovata.

Impossibile caricare l'assembly o una delle relative dipendenze.

Nota: in .NET per le app dello Store Windows o Portable Class Library, intercettare invece l'eccezione della classe base IOException.

L'assembly o una delle relative dipendenze non è valido per il runtime attualmente caricato.

Esempio

Nell'esempio seguente viene recuperato il tipo di System.Int32 e viene utilizzato l'oggetto type per visualizzare la FullName proprietà di System.Int32. Se un oggetto di tipo fa riferimento a un assembly che non esiste, in questo esempio viene generata un'eccezione.

using System;

class GetTypeExample
{
     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
open System

try
    // Get the type of a specified class.
    let myType1 = Type.GetType "System.Int32"
    printfn $"The full name is {myType1.FullName}.\n"
with :? TypeLoadException as e ->
    printfn $"{e.GetType().Name}: Unable to load type System.Int32"

try
    // Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
    let myType2 = Type.GetType("NoneSuch", true)
    printfn $"The full name is {myType2.FullName}."
with :? TypeLoadException as e ->
    printfn $"{e.GetType().Name}: Unable to load type NoneSuch"
// 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 utilizzare il GetType metodo per ottenere un Type oggetto per un tipo in un altro assembly se si conosce il nome completo dell'assembly, che può essere ottenuto da AssemblyQualifiedName. GetType causa il caricamento dell'assembly specificato in typeName. È anche possibile caricare un assembly usando il Assembly.Load metodo e quindi usare il Assembly.GetType metodo o Assembly.GetTypes per ottenere Type oggetti. Se un tipo si trova in un assembly noto al programma in fase di compilazione, è più efficiente usare in C# o l'operatore />

solo .NET Framework: GetType funziona solo sugli assembly caricati dal disco. Se si chiama GetType per cercare un tipo definito in un assembly dinamico definito usando i System.Reflection.Emit servizi, è possibile che si verifichi un comportamento incoerente. Il comportamento dipende dal fatto che l'assembly dinamico sia persistente, ovvero creato usando le RunAndSave modalità di accesso o Save dell'enumerazione System.Reflection.Emit.AssemblyBuilderAccess . Se l'assembly dinamico è persistente ed è stato scritto su disco prima GetType della chiamata, il caricatore trova l'assembly salvato su disco, carica tale assembly e recupera il tipo 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 chiamata GetType a per recuperare un tipo in un assembly dinamico temporaneo restituisce null.

In .NET Framework, per usare in un modulo dinamico, sottoscrivere l'evento /> prima di salvare. In caso contrario, si otterranno due copie dell'assembly in memoria.

In .NET Core 3.0 e versioni successive, i carichi di assembly attivati da questa API sono interessati dal valore corrente di AssemblyLoadContext.CurrentContextualReflectionContext.

Il throwOnError parametro specifica cosa accade quando il tipo non viene trovato e elimina anche determinate altre condizioni di eccezione, come 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 della classe base restituiti dai Get metodi quando si analizza un tipo.

Tipo di membro Static Non statico
Costruttore No No
Campo No Yes. Un campo è sempre nascosto per nome e firma.
Event 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 di seguito.
metodo No Yes. Un metodo (virtuale e non virtuale) può essere nascosto per nome o nascosto per nome e firma.
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 di seguito.
  1. 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.

  2. In riflessione, le proprietà e gli eventi sono hide-by-name-and-signature. Se si dispone di una proprietà con una funzione di accesso get e set nella classe 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 base.

  3. 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 dallo spazio dei nomi o un nome completo dell'assembly che include una specifica del nome dell'assembly. Vedete AssemblyQualifiedName.

Se typeName include lo spazio dei nomi ma non il nome dell'assembly, questo metodo cerca solo l'assembly dell'oggetto chiamante e mscorlib.dll/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 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 nidificata e la reflection costruisce un nome sbrogliato quando viene eseguita una query, in base alle convenzioni seguenti.

Note

L'architettura del processore fa parte dell'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 AssemblyQualifiedName proprietà, per motivi di compatibilità. È anche possibile caricare i tipi creando un AssemblyName oggetto e passandolo a un overload appropriato del Load metodo . È quindi possibile usare il Assembly.GetType metodo per caricare i tipi dall'assembly. Vedi 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 qualificato dall'assembly.
Virgola (,) Precede il nome dell'assembly.
Punto (.) Indica gli identificatori dello spazio dei nomi.
Segno di addizione (+) Precede una classe nidificata.

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 dovrà precedere il segno più (+) con un carattere di escape (\) per evitare che venga interpretato 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 usato in un secondo momento per caricare .Type Per cercare e caricare un Typeoggetto , usare GetType solo con il nome del tipo o con il nome completo dell'assembly. GetType con il nome del tipo cercherà Type solo nell'assembly del chiamante e quindi nell'assembly di sistema. GetType con il nome del tipo completo dell'assembly cercherà in Type 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 di puntatore o un tipo di matrice. Per recuperare il nome del tipo senza questi caratteri finali, usare t.GetElementType().ToString(), dove t è il 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 del nome è 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 Tuple`1 e Tuple`2 dai metodi generici Tuple(Of T) e Tuple(Of T0, T1) in Visual Basic oppure Tuple<T> e Tuple<T0, T1> in Visual 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> oggetto di MyType con chiavi di tipo String può essere rappresentato nel modo seguente:

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 qualificato dall'assembly vengono interpretate come delimitando argomenti di tipo aggiuntivi. Ad esempio, un Dictionary<TKey,TValue> oggetto di da MyType MyAssembly.dll, con chiavi di tipo String, può essere specificato come segue:

Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")

Note

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 assembly per tipi qualificati e non qualificati negli elenchi di parametri di tipo sono le stesse delle regole per i tipi non generici qualificati e non qualificati.

I tipi nullable sono un caso speciale di tipi generici. Ad esempio, un valore nullable Int32 è rappresentato dalla stringa "System.Nullable'1[System.Int32]".

Note

È anche possibile ottenere tipi nullable usando operatori di tipo. Ad esempio, il tipo Boolean nullable viene restituito da typeof(Nullable<bool>) in C# e da GetType(Nullable(Of Boolean)) in Visual Basic.

Nella tabella seguente viene illustrata la sintassi usata con GetType per vari tipi.

Ottenere Utilizzo
Un valore 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 livello.
Una classe padre e una classe nidificata Type.GetType("MyParentClass+MyNestedClass")
Matrice unidimensionale con un limite inferiore pari a 0 Type.GetType("MyArray[]")
Matrice unidimensionale con un limite inferiore sconosciuto Type.GetType("MyArray[*]")
Matrice ndimensionale Una virgola (,) all'interno delle parentesi quadre è un totale di n-1 volte. Ad esempio, System.Object[,,] rappresenta una matrice tridimensionale Object .
Matrice bidimensionale di una matrice 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 qualificato 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

Si applica a

GetType(String, Boolean, Boolean)

Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs

Ottiene l'oggetto Type con il nome specificato, specificando se generare un'eccezione se il tipo non viene trovato 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);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
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
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
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 completo dell'assembly del tipo da ottenere. Vedete AssemblyQualifiedName. Se il tipo si trova nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, è sufficiente specificare il nome del tipo qualificato dal relativo spazio dei nomi.

throwOnError
Boolean

true per generare un'eccezione se non è possibile trovare il tipo; false per restituire null. Specificando false vengono eliminate anche alcune altre condizioni di eccezione, ma non tutte. Vedere la sezione Eccezioni.

ignoreCase
Boolean

true per eseguire una ricerca senza distinzione tra maiuscole e minuscole per typeName, false per eseguire una ricerca con distinzione tra maiuscole e minuscole per typeName.

Valori restituiti

Tipo con il nome specificato. Se il tipo non viene trovato, il throwOnError parametro specifica se null viene restituito o se viene generata un'eccezione. In alcuni casi, viene generata un'eccezione indipendentemente dal valore di throwOnError. Vedere la sezione Eccezioni.

Attributi

Eccezioni

typeName è null.

Un inizializzatore di classe viene richiamato e genera un'eccezione.

throwOnError è true e il tipo non viene trovato.

oppure

throwOnError è true e typeName contiene caratteri non validi, ad esempio una scheda incorporata.

oppure

throwOnErrorè e true è 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 typeName contiene una sintassi non valida. Ad esempio, "MyType[,*,]".

oppure

typeName rappresenta un tipo generico con un tipo di puntatore, un ByRef tipo o Void come uno dei relativi argomenti di tipo.

oppure

typeName rappresenta un tipo generico con 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 relative dipendenze non è stata trovata.

Impossibile caricare l'assembly o una delle relative dipendenze.

L'assembly non è valido per il runtime attualmente caricato.

Commenti

È possibile utilizzare il GetType metodo per ottenere un Type oggetto per un tipo in un altro assembly se si conosce il nome completo dell'assembly, che può essere ottenuto da AssemblyQualifiedName. GetType causa il caricamento dell'assembly specificato in typeName. È anche possibile caricare un assembly usando il Assembly.Load metodo e quindi usare il Assembly.GetType metodo o Assembly.GetTypes per ottenere Type oggetti. Se un tipo si trova in un assembly noto al programma in fase di compilazione, è più efficiente usare in C# o l'operatore />

solo .NET Framework: GetType funziona solo sugli assembly caricati dal disco. Se si chiama GetType per cercare un tipo definito in un assembly dinamico definito usando i System.Reflection.Emit servizi, è possibile che si verifichi un comportamento incoerente. Il comportamento dipende dal fatto che l'assembly dinamico sia persistente, ovvero creato usando le RunAndSave modalità di accesso o Save dell'enumerazione System.Reflection.Emit.AssemblyBuilderAccess . Se l'assembly dinamico è persistente ed è stato scritto su disco prima GetType della chiamata, il caricatore trova l'assembly salvato su disco, carica tale assembly e recupera il tipo 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 chiamata GetType a per recuperare un tipo in un assembly dinamico temporaneo restituisce null.

In .NET Framework, per usare in un modulo dinamico, sottoscrivere l'evento /> prima di salvare. In caso contrario, si otterranno due copie dell'assembly in memoria.

In .NET Core 3.0 e versioni successive, i carichi di assembly attivati da questa API sono interessati dal valore corrente di AssemblyLoadContext.CurrentContextualReflectionContext.

Il throwOnError parametro specifica cosa accade quando il tipo non viene trovato e elimina anche determinate altre condizioni di eccezione, come 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 della classe base restituiti dai Get metodi quando si analizza un tipo.

Tipo di membro Static Non statico
Costruttore No No
Campo No Yes. Un campo è sempre nascosto per nome e firma.
Event 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 di seguito.
metodo No Yes. Un metodo (virtuale e non virtuale) può essere nascosto per nome o nascosto per nome e firma.
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 di seguito.
  1. 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.

  2. In riflessione, le proprietà e gli eventi sono hide-by-name-and-signature. Se si dispone di una proprietà con una funzione di accesso get e set nella classe 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 base.

  3. 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 dallo spazio dei nomi o un nome completo dell'assembly che include una specifica del nome dell'assembly. Vedete AssemblyQualifiedName.

Se typeName include lo spazio dei nomi ma non il nome dell'assembly, questo metodo cerca solo l'assembly dell'oggetto chiamante e mscorlib.dll/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 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 generano il nome semplice di una classe nidificata e la reflection costruisce un nome sbrogliato quando viene eseguita una query, in base alle convenzioni seguenti.

Note

L'architettura del processore fa parte dell'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 AssemblyQualifiedName proprietà, per motivi di compatibilità. È anche possibile caricare i tipi creando un AssemblyName oggetto e passandolo a un overload appropriato del Load metodo . È quindi possibile usare il Assembly.GetType metodo per caricare i tipi dall'assembly. Vedi 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 qualificato dall'assembly.
Virgola (,) Precede il nome dell'assembly.
Punto (.) Indica gli identificatori dello spazio dei nomi.
Segno di addizione (+) Precede una classe nidificata.

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 dovrà precedere il segno più (+) con un carattere di escape (\) per evitare che venga interpretato 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 usato in un secondo momento per caricare .Type Per cercare e caricare un Typeoggetto , usare GetType solo con il nome del tipo o con il nome completo dell'assembly. GetType con il nome del tipo cercherà Type solo nell'assembly del chiamante e quindi nell'assembly di sistema. GetType con il nome del tipo completo dell'assembly cercherà in Type 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 di puntatore o un tipo di matrice. Per recuperare il nome del tipo senza questi caratteri finali, usare t.GetElementType().ToString(), dove t è il 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 del nome è 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 Tuple`1 e Tuple`2 dai metodi generici Tuple(Of T) e Tuple(Of T0, T1) in Visual Basic oppure Tuple<T> e Tuple<T0, T1> in Visual 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> oggetto di MyType con chiavi di tipo String può essere rappresentato nel modo seguente:

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 qualificato dall'assembly vengono interpretate come delimitando argomenti di tipo aggiuntivi. Ad esempio, un Dictionary<TKey,TValue> oggetto di da MyType MyAssembly.dll, con chiavi di tipo String, può essere specificato come segue:

Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")

Note

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 assembly per tipi qualificati e non qualificati negli elenchi di parametri di tipo sono le stesse delle regole per i tipi non generici qualificati e non qualificati.

I tipi nullable sono un caso speciale di tipi generici. Ad esempio, un valore nullable Int32 è rappresentato dalla stringa "System.Nullable'1[System.Int32]".

Note

È anche possibile ottenere tipi nullable usando operatori di tipo. Ad esempio, il tipo Boolean nullable viene restituito da typeof(Nullable<bool>) in C# e da GetType(Nullable(Of Boolean)) in Visual Basic.

Nella tabella seguente viene illustrata la sintassi usata con GetType per vari tipi.

Ottenere Utilizzo
Un valore 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 livello.
Una classe padre e una classe nidificata Type.GetType("MyParentClass+MyNestedClass")
Matrice unidimensionale con un limite inferiore pari a 0 Type.GetType("MyArray[]")
Matrice unidimensionale con un limite inferiore sconosciuto Type.GetType("MyArray[*]")
Matrice ndimensionale Una virgola (,) all'interno delle parentesi quadre è un totale di n-1 volte. Ad esempio, System.Object[,,] rappresenta una matrice tridimensionale Object .
Matrice bidimensionale di una matrice 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 qualificato 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

Si applica a

GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>)

Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs

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);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
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);
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> -> Type
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 specificato il typeResolver parametro , il nome del tipo può essere qualsiasi stringa in typeResolver grado di risolvere. Se il parametro viene fornito o se viene usata la assemblyResolver risoluzione dei tipi standard, typeName deve essere un nome qualificato dall'assembly (vedere AssemblyQualifiedName), a meno che il tipo non si trova nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, nel qual caso è sufficiente specificare il nome del tipo qualificato dallo 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 AssemblyName oggetto . Se typeName non contiene il nome di un assembly, assemblyResolver non viene chiamato . Se assemblyResolver non viene specificato, viene eseguita la risoluzione dell'assembly standard.

Attenzione: non passare metodi da chiamanti sconosciuti o non attendibili. In questo modo potrebbe verificarsi l'elevazione dei privilegi per il codice dannoso. Usare solo i metodi forniti o con cui si ha familiarità.

typeResolver
Func<Assembly,String,Boolean,Type>

Metodo che individua e restituisce il tipo specificato da typeName dall'assembly restituito da o dalla assemblyResolver risoluzione dell'assembly standard. Se non viene fornito alcun assembly, il typeResolver metodo può specificarne uno. Il metodo accetta anche un parametro che specifica se eseguire una ricerca senza distinzione tra maiuscole e minuscole; false viene passato a tale parametro.

Attenzione: non passare metodi da chiamanti sconosciuti o non attendibili.

Valori restituiti

Tipo con il nome specificato o null se il tipo non viene trovato.

Attributi

Eccezioni

typeName è null.

Un inizializzatore di classe viene richiamato e genera un'eccezione.

Si verifica un errore quando typeName viene analizzato in un nome di tipo e in un nome di assembly, ad esempio quando il nome del tipo semplice include un carattere speciale senza caratteri di escape.

oppure

typeName rappresenta un tipo generico con un tipo di puntatore, un ByRef tipo o Void come uno dei relativi argomenti di tipo.

oppure

typeName rappresenta un tipo generico con 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 un tipo non valido, ad esempio una matrice di TypedReference.

Impossibile caricare l'assembly o una delle relative dipendenze.

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 per il runtime attualmente caricato.

Commenti

Gli scenari di utilizzo per questo metodo e i dettagli sui assemblyResolver parametri e typeResolver sono disponibili nell'overload del GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) metodo.

Note

Se typeName non è possibile trovare , la chiamata al GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) metodo restituisce null. Non genera un'eccezione. Per controllare se viene generata un'eccezione, chiamare un overload del GetType metodo con un throwOnError parametro .

La chiamata a questo overload del metodo equivale a chiamare l'overload del GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) metodo e specificare false per i throwOnError parametri e ignoreCase .

Si applica a

GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)

Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs

Ottiene il tipo con il nome specificato, specificando se generare un'eccezione se il tipo non viene trovato e, facoltativamente, fornendo 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);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
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);
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool -> Type
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 specificato il typeResolver parametro , il nome del tipo può essere qualsiasi stringa in typeResolver grado di risolvere. Se il parametro viene fornito o se viene usata la assemblyResolver risoluzione dei tipi standard, typeName deve essere un nome qualificato dall'assembly (vedere AssemblyQualifiedName), a meno che il tipo non si trova nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, nel qual caso è sufficiente specificare il nome del tipo qualificato dallo 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 AssemblyName oggetto . Se typeName non contiene il nome di un assembly, assemblyResolver non viene chiamato . Se assemblyResolver non viene specificato, viene eseguita la risoluzione dell'assembly standard.

Attenzione: non passare metodi da chiamanti sconosciuti o non attendibili. In questo modo potrebbe verificarsi l'elevazione dei privilegi per il codice dannoso. Usare solo i metodi forniti o con cui si ha familiarità.

typeResolver
Func<Assembly,String,Boolean,Type>

Metodo che individua e restituisce il tipo specificato da typeName dall'assembly restituito da o dalla assemblyResolver risoluzione dell'assembly standard. Se non viene fornito alcun assembly, il metodo può specificarne uno. Il metodo accetta anche un parametro che specifica se eseguire una ricerca senza distinzione tra maiuscole e minuscole; false viene passato a tale parametro.

Attenzione: non passare metodi da chiamanti sconosciuti o non attendibili.

throwOnError
Boolean

true per generare un'eccezione se non è possibile trovare il tipo; false per restituire null. Specificando false vengono eliminate anche alcune altre condizioni di eccezione, ma non tutte. Vedere la sezione Eccezioni.

Valori restituiti

Tipo con il nome specificato. Se il tipo non viene trovato, il throwOnError parametro specifica se null viene restituito o se viene generata un'eccezione. In alcuni casi, viene generata un'eccezione indipendentemente dal valore di throwOnError. Vedere la sezione Eccezioni.

Attributi

Eccezioni

typeName è null.

Un inizializzatore di classe viene richiamato e genera un'eccezione.

throwOnError è true e il tipo non viene trovato.

oppure

throwOnError è true e typeName contiene caratteri non validi, ad esempio una scheda incorporata.

oppure

throwOnErrorè e true è 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 in un nome di assembly, ad esempio quando il nome del tipo semplice include un carattere speciale senza caratteri di escape.

oppure

throwOnError è true e typeName contiene una sintassi non valida (ad esempio, "MyType[,*,]").

oppure

typeName rappresenta un tipo generico con un tipo di puntatore, un ByRef tipo o Void come uno dei relativi argomenti di tipo.

oppure

typeName rappresenta un tipo generico con 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 relative dipendenze non è stata trovata.

oppure

typeName contiene un nome di assembly non valido.

oppure

typeName è un nome di assembly valido senza un nome di tipo.

Impossibile caricare l'assembly o una delle relative dipendenze.

L'assembly o una delle relative dipendenze non è valido per il runtime attualmente caricato.

Commenti

Gli scenari di utilizzo per questo metodo e i dettagli sui assemblyResolver parametri e typeResolver sono disponibili nell'overload del GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) metodo.

La chiamata a questo overload del metodo equivale a chiamare l'overload del GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) metodo e specificare false per il ignoreCase parametro .

Si applica a

GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)

Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs
Origine:
Type.CoreCLR.cs

Ottiene il tipo con il nome specificato, specificando se eseguire una ricerca con distinzione tra maiuscole e minuscole e se generare un'eccezione se il tipo non viene trovato e, facoltativamente, fornendo 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);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
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);
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);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool * bool -> Type
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 specificato il typeResolver parametro , il nome del tipo può essere qualsiasi stringa in typeResolver grado di risolvere. Se il parametro viene fornito o se viene usata la assemblyResolver risoluzione dei tipi standard, typeName deve essere un nome qualificato dall'assembly (vedere AssemblyQualifiedName), a meno che il tipo non si trova nell'assembly attualmente in esecuzione o in mscorlib.dll/System.Private.CoreLib.dll, nel qual caso è sufficiente specificare il nome del tipo qualificato dallo 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 AssemblyName oggetto . Se typeName non contiene il nome di un assembly, assemblyResolver non viene chiamato . Se assemblyResolver non viene specificato, viene eseguita la risoluzione dell'assembly standard.

Attenzione: non passare metodi da chiamanti sconosciuti o non attendibili. In questo modo potrebbe verificarsi l'elevazione dei privilegi per il codice dannoso. Usare solo i metodi forniti o con cui si ha familiarità.

typeResolver
Func<Assembly,String,Boolean,Type>

Metodo che individua e restituisce il tipo specificato da typeName dall'assembly restituito da o dalla assemblyResolver risoluzione dell'assembly standard. Se non viene fornito alcun assembly, il metodo può specificarne uno. Il metodo accetta anche un parametro che specifica se eseguire una ricerca senza distinzione tra maiuscole e minuscole; il valore di ignoreCase viene passato a tale parametro.

Attenzione: non passare metodi da chiamanti sconosciuti o non attendibili.

throwOnError
Boolean

true per generare un'eccezione se non è possibile trovare il tipo; false per restituire null. Specificando false vengono eliminate anche alcune altre condizioni di eccezione, ma non tutte. Vedere la sezione Eccezioni.

ignoreCase
Boolean

true per eseguire una ricerca senza distinzione tra maiuscole e minuscole per typeName, false per eseguire una ricerca con distinzione tra maiuscole e minuscole per typeName.

Valori restituiti

Tipo con il nome specificato. Se il tipo non viene trovato, il throwOnError parametro specifica se null viene restituito o se viene generata un'eccezione. In alcuni casi, viene generata un'eccezione indipendentemente dal valore di throwOnError. Vedere la sezione Eccezioni.

Attributi

Eccezioni

typeName è null.

Un inizializzatore di classe viene richiamato e genera un'eccezione.

throwOnError è true e il tipo non viene trovato.

oppure

throwOnError è true e typeName contiene caratteri non validi, ad esempio una scheda incorporata.

oppure

throwOnErrorè e true è 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 in un nome di assembly, ad esempio quando il nome del tipo semplice include un carattere speciale senza caratteri di escape.

oppure

throwOnError è true e typeName contiene una sintassi non valida (ad esempio, "MyType[,*,]").

oppure

typeName rappresenta un tipo generico con un tipo di puntatore, un ByRef tipo o Void come uno dei relativi argomenti di tipo.

oppure

typeName rappresenta un tipo generico con 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 relative dipendenze non è stata trovata.

Impossibile caricare l'assembly o una delle relative dipendenze.

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 è un assembly valido per il runtime attualmente caricato.

Commenti

In .NET Core 3.0 e versioni successive, se assemblyResolver è Null, i caricamenti dell'assembly attivati da questa API sono interessati dal valore corrente di AssemblyLoadContext.CurrentContextualReflectionContext.

Usare l'overload del GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) metodo e gli overload associati (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) e GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) per sostituire l'implementazione predefinita del GetType metodo con 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 moduli usando nomi di moduli parziali.
  • Restituisce sottoclassi di System.Type che non vengono create da Common Language Runtime (CLR).

Ad esempio, nella serializzazione a tolleranza di versione questo metodo consente di cercare un assembly "più adatto" usando un nome parziale. Altri overload del GetType metodo richiedono un nome di tipo qualificato dall'assembly, che include il numero di versione.

Le implementazioni alternative del sistema di tipi potrebbero dover restituire sottoclassi di System.Type che non vengono create da CLR. Tutti i tipi restituiti da altri overload del GetType metodo sono tipi di runtime.

Note sull'utilizzo

Questo overload del metodo e gli overload associati analizzano il nome di un tipo e il nome di un assembly e quindi risolvono typeName i nomi. La risoluzione del nome dell'assembly si verifica prima della risoluzione del nome del tipo, perché è necessario risolvere un nome di tipo nel contesto di un assembly.

Note

Se non si ha familiarità con il concetto di nomi di tipi qualificati dall'assembly, vedere la proprietà AssemblyQualifiedName.

Se typeName non è un nome qualificato dall'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 puoi specificare facoltativamente un assembly nel parametro typeResolver. 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 o typeResolver se provengono da chiamanti sconosciuti o non attendibili. Usare solo i metodi forniti o con cui si ha familiarità.

    Caution

    L'uso di metodi di chiamanti sconosciuti o non attendibili potrebbe comportare l'elevazione dei privilegi per il codice dannoso.

  • Se si omettono i assemblyResolver parametri e/o typeResolver , il valore del throwOnError parametro viene passato ai metodi che eseguono la risoluzione predefinita.

  • Se throwOnError è true, questo metodo genera un'eccezione TypeLoadException quando typeResolver restituisce null, e un'eccezione FileNotFoundException quando assemblyResolver restituisce null.

  • Questo metodo non intercetta le eccezioni generate da assemblyResolver e typeResolver. L'utente è responsabile di tutte le eccezioni generate dai metodi del sistema di risoluzione.

Risolvere gli assembly

Il assemblyResolver metodo riceve un AssemblyName oggetto, generato analizzando il nome dell'assembly stringa incluso in typeName. Se typeName non contiene un nome di assembly, assemblyResolver non viene chiamato e null viene passato a typeResolver.

Se assemblyResolver non viene fornito, per individuare l'assembly viene usato il probe di assembly standard. Se assemblyResolver viene specificato, il GetType metodo non esegue il sondaggio standard; in tal caso dovete assicurarvi che assemblyResolver possa gestire tutti gli assembly che gli passate.

Il assemblyResolver metodo deve restituire null se l'assembly non può essere risolto. Se assemblyResolver restituisce null, typeResolver non viene chiamato e non viene eseguita alcuna ulteriore elaborazione; inoltre, se throwOnError è true, viene generata un'eccezione FileNotFoundException .

Se l'oggetto AssemblyName passato a assemblyResolver è un nome parziale, una o più parti sono null. Ad esempio, se non ha una versione, la Version proprietà è null. Se la proprietà Version, la proprietà CultureInfo e il metodo GetPublicKeyToken restituiscono tutti null, è stato fornito solo il nome semplice dell'assembly. Il assemblyResolver metodo può utilizzare o ignorare tutte le parti del nome dell'assembly.

Gli effetti delle diverse opzioni di risoluzione degli assemblaggi vengono mostrati in una tabella nella sezione Risoluzione dei nomi misti per i nomi di tipo semplici e qualificati rispetto all'assemblaggio.

Risolvere i tipi

Se typeName non specifica un nome di assembly, typeResolver viene sempre chiamato . Se typeName specifica un nome di assembly, typeResolver viene chiamato solo quando il nome dell'assembly viene risolto correttamente. Se assemblyResolver o l'analisi standard dell'assembly restituisce null, typeResolver non viene chiamato.

Il typeResolver metodo riceve tre argomenti:

  • L'assemblaggio da cercare o null se typeName non contiene un nome di assemblaggio.
  • Nome semplice del tipo. Nel caso di un tipo annidato, si tratta del tipo contenitore più esterno. Nel caso di un tipo generico, si tratta del nome semplice del tipo generico.
  • Un valore booleano che è true se il caso dei nomi dei tipi deve essere ignorato.

L'implementazione determina la modalità di utilizzo di questi argomenti. Il typeResolver metodo deve restituire null se non è in grado di risolvere il tipo. Se typeResolver restituisce null e throwOnError è true, questo overload di GetType lancia 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 tipi semplici e qualificati dall'assembly.

Risolvere i tipi annidati

Se typeName è un tipo annidato, viene passato solo il nome del tipo contenitore più esterno a typeResolver. Quando typeResolver restituisce questo tipo, il GetNestedType metodo viene chiamato in modo ricorsivo fino a quando non viene risolto il tipo annidato più interno.

Risolvere i tipi generici

Viene GetType chiamato in modo ricorsivo per risolvere i tipi generici: prima di tutto per risolvere il tipo generico stesso e quindi 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 di assemblyResolver e typeResolver che fornisci deve essere in grado di risolvere tutti i livelli di questa ricorsione. Si supponga, ad esempio, di fornire un oggetto assemblyResolver che controlla il caricamento di MyAssembly. Si supponga di voler risolvere il tipo Dictionary<string, MyType> generico (Dictionary(Of String, MyType) in Visual Basic). È possibile passare il seguente nome di tipo generico:

"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 Dictionary<TKey,TValue> classi e String non sono qualificati per assembly. Il tuo typeResolver deve essere in grado di gestire un assembly o null, perché riceverà null per Dictionary<TKey,TValue> e String. Può gestire questo caso chiamando un overload del metodo GetType che accetta una stringa, poiché entrambi i nomi di tipi non qualificati si trovano in mscorlib.dll/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)
                     );
let t =
    Type.GetType(test,
        (fun aName ->
            if aName.Name = "MyAssembly" then
                Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
            else null),
        fun assem name ignr ->
            if assem = null then
                Type.GetType(name, false, ignr)
            else
                assem.GetType(name, false, ignr))

Il assemblyResolver metodo non viene chiamato per il tipo di dizionario e il tipo stringa, perché tali nomi di tipo non sono qualificati dall'assembly.

Supponiamo ora che, invece di System.String, il primo tipo di argomento generico sia YourType, da 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 è né mscorlib.dll/System.Private.CoreLib.dll né l'assembly attualmente in esecuzione, non è possibile risolvere YourType senza un nome qualificato dell'assembly. assemblyResolve Poiché verrà chiamato in modo ricorsivo, deve essere in grado di gestire questo caso. Anziché restituire null per assembly diversi da MyAssembly, esegue ora un caricamento di assembly usando l'oggetto fornito AssemblyName .

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
                      );
let t2 =
    Type.GetType(test,
        (fun aName ->
            if aName.Name = "MyAssembly" then
                Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
            else Assembly.Load aName),
        (fun assem name ignr ->
            if assem = null then
                Type.GetType(name, false, ignr)
            else
                assem.GetType(name, false, ignr)), true)
Risolvere i nomi dei tipi con caratteri speciali

Alcuni caratteri hanno significati speciali nei nomi qualificati dall'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 qualificato dall'assembly. Per evitare gli errori di analisi, i caratteri speciali devono essere preceduti da una barra rovesciata prima di poter passare il nome completo dell'assembly al metodo GetType. Ad esempio, se un tipo è denominato Strange]Type, il carattere di escape deve essere aggiunto prima della parentesi quadrata come indicato di seguito: Strange\]Type.

Note

I nomi con tali caratteri speciali non possono essere creati in Visual Basic o C#, ma possono essere creati usando il linguaggio intermedio comune (CIL) o emettendo assembly dinamici.

Nella tabella seguente vengono illustrati i caratteri speciali per i nomi dei tipi.

Personaggio Significato
, (virgola) Delimitatore per i nomi qualificati dall'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 qualificati di assembly.
& (e commerciale) Come suffisso, indica che un tipo è un tipo riferimento.
* (asterisco) Come suffisso, indica che un tipo è un tipo di puntatore.
+ (più) Delimitatore per i tipi annidati.
\ (barra rovesciata) Carattere di escape.

Proprietà come AssemblyQualifiedName restituiscono stringhe con caratteri escape corretti. È necessario passare correttamente stringhe di escape al GetType metodo . A sua volta, il GetType metodo passa nomi di escape corretti a typeResolver e ai metodi di risoluzione dei tipi predefiniti. Se è necessario confrontare un nome con un nome senza caratteri di escape in typeResolver, è necessario rimuovere i caratteri di escape.

Risoluzione dei nomi misti

La tabella seguente riepiloga le interazioni tra assemblyResolver, typeResolvere la risoluzione dei nomi predefinita, per tutte le combinazioni di nome di tipo e nome dell'assembly in typeName:

Contenuto del nome del tipo Metodo resolver di assembly Metodo di risoluzione dei tipi Result
tipo, assemblaggio Null Null Equivale a chiamare il metodo Type.GetType(String, Boolean, Boolean) overload.
tipo, assemblaggio 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 Assembly.GetType(String, Boolean, Boolean) viene utilizzato per caricare il tipo dall'assembly; in caso contrario, non si tenta di risolvere il tipo.
tipo, assemblaggio Null fornito Equivale a convertire il nome dell'assembly in un oggetto AssemblyName e chiamare un sovraccarico del metodo Assembly.Load(AssemblyName) per ottenere l'assembly. Se l'assembly viene risolto, viene passato a typeResolver; altrimenti, typeResolver non viene chiamato e non viene fatto alcun ulteriore tentativo di risolvere il tipo.
tipo, assemblaggio 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 typeResolver; altrimenti, typeResolver non viene chiamato e non viene fatto alcun ulteriore tentativo di risolvere il tipo.
type Null, fornito Null Equivale a chiamare il metodo Type.GetType(String, Boolean, Boolean) overload. Poiché il nome dell'assembly non viene specificato, vengono cercati solo mscorlib.dll/System.Private.CoreLib.dll e l'assembly attualmente in esecuzione. Se assemblyResolver viene specificato, viene ignorato.
type Null, fornito fornito typeResolver viene chiamato e null viene passato per l'assemblaggio. typeResolver può fornire un tipo da qualsiasi assembly, inclusi gli assembly caricati a tale scopo. Se assemblyResolver viene specificato, viene ignorato.
assemblea 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. In questo modo viene restituito un nome di assembly non valido.

Si applica a