Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

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

.NET Framework (current version)
 

Data di pubblicazione: ottobre 2016

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.

Spazio dei nomi:   System
Assembly:  mscorlib (in mscorlib.dll)

public static Type GetType(
	string typeName,
	Func<AssemblyName, Assembly> assemblyResolver,
	Func<Assembly, string, bool, Type> typeResolver,
	bool throwOnError,
	bool ignoreCase
)

Parametri

typeName
Type: System.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, nel qual caso è sufficiente fornire il nome del tipo completo di spazio dei nomi.

assemblyResolver
Type: System.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.

typeResolver
Type: System.Func<Assembly, String, Boolean, Type>

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
Type: System.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
Type: System.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.

Valore restituito

Type: System.Type

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.

Exception Condition
ArgumentNullException

typeName è null.

TargetInvocationException

Viene richiamato un inizializzatore di classi e viene generata un'eccezione.

TypeLoadException

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.

ArgumentException

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.

FileNotFoundException

throwOnError è true e l'assembly o una delle sue dipendenze non è stato trovato.

FileLoadException

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.

BadImageFormatException

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.

Utilizzare questo overload del 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ù flessibile. Fornendo i propri metodi di cui risolvere i nomi dei tipi e i nomi degli assembly che li contengono, è possibile eseguire le operazioni seguenti:

  • Controllare la versione di un assembly con un tipo viene caricato da.

  • Fornire un'altra posizione per cercare un nome di tipo che non include un nome di assembly.

  • Caricare gli assembly con nomi di assembly parziali.

  • Restituire le sottoclassi di System.Type che non vengono creati da common language runtime (CLR).

Ad esempio, di serializzazione a tolleranza di versione questo metodo consente di cercare un assembly con nome "adatta" con un nome parziale. Altri overload di GetType metodo richiede un nome di tipo qualificato dall'assembly, che include il numero di versione.

Potrebbe essere necessario implementazioni alternative del sistema di tipi restituire le sottoclassi di System.Type che non vengono create da CLR, tutti i tipi che vengono restituiti da altri overload di GetType metodo sono tipi di runtime.

Questo overload del metodo e gli overload associati analizzano typeName nel nome di un tipo e il nome di un assembly e quindi la risoluzione dei nomi. Risoluzione del nome dell'assembly si verifica prima della risoluzione del nome del tipo, perché un nome di tipo deve essere risolto nel contesto di un assembly.

System_CAPS_noteNota

Se non si ha familiarità con il concetto di nomi di tipo qualificato dall'assembly, vedere il AssemblyQualifiedName proprietà.

Se typeName non è un nome completo dell'assembly, la risoluzione dell'assembly viene ignorata. I nomi dei tipi non qualificati possono essere risolti nel contesto di mscorlib. dll o assembly attualmente in esecuzione o, facoltativamente, è possibile specificare un assembly nel typeResolver parametro. Gli effetti di inclusione o omettere il nome dell'assembly per tipi diversi di risoluzione dei nomi vengono visualizzati come una tabella di Risoluzione mista sezione.

Note sull'utilizzo generale:

  • Non passare metodi da assemblyResolver o typeResolver se provengono da chiamanti non noti o non attendibili. Usare solo i metodi forniti o con cui si ha dimestichezza.

    System_CAPS_cautionAttenzione

    Con i metodi da chiamanti non noti o non attendibili potrebbe causare l'elevazione dei privilegi per codice dannoso.

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

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

  • Questo metodo non intercetta le eccezioni generate dalle assemblyResolver e typeResolver. Si è responsabili di eventuali eccezioni generate dai metodi di sistema di risoluzione.

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

Se assemblyResolver non è fornito, standard di assembly di probe viene utilizzato per individuare l'assembly. Se assemblyResolver viene fornito il GetType metodo non esegue una ricerca standard; in tal caso è necessario assicurarsi che il assemblyResolver in grado di gestire tutti gli assembly vengono passati.

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

Se il AssemblyName che viene passata a assemblyResolver è un elemento parziale sono nome, uno o più delle relative parti null. Ad esempio, se dispone di alcuna versione, il Version proprietà null. Se il Version proprietà, il CultureInfo , proprietà e GetPublicKeyToken metodo tutte restituito null, quindi solo il nome semplice dell'assembly è stato fornito. Il assemblyResolver metodo può usare o ignorare tutte le parti del nome dell'assembly.

Gli effetti delle opzioni di risoluzione assembly diversi vengono visualizzati come una tabella di Risoluzione mista sezione, per i nomi di tipo semplice e completo di assembly.

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 è stato risolto. Se assemblyResolver o dell'assembly standard restituisce null, typeResolver non viene chiamato.

Il typeResolver metodo riceve tre argomenti:

  • L'assembly da cercare o null se typeName non contiene un nome di assembly.

  • Il nome del tipo semplice. Nel caso di un tipo annidato, questo è il tipo di contenitore più esterno. Nel caso di un tipo generico, questo è il nome semplice di tipo generico.

  • Un valore booleano che è true se nel caso di nomi di tipo viene ignorato.

L'implementazione determina il modo in cui che vengono utilizzati questi argomenti. Il typeResolver metodo dovrebbe restituire null se risulta impossibile risolvere il tipo. Se typeResolver restituisce null e throwOnError è true, questo overload di GetType genera un TypeLoadException.

Gli effetti delle opzioni di risoluzione di diverso tipo vengono visualizzati come una tabella di Risoluzione mista sezione, per i nomi di tipo semplice e completo di assembly.

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

Il GetType viene chiamato in modo ricorsivo per risolvere i tipi generici: per risolvere il tipo generico stesso e quindi di 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 forniti deve essere in grado di risolvere tutti i livelli di questo tipo di ricorsione. Ad esempio, si supponga di fornire un assemblyResolver che controlla il caricamento di MyAssembly. Si supponga che si desidera 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'argomento di tipo solo qualificato dall'assembly. I nomi del Dictionary<TKey, TValue> e String classi non sono completi di assembly. Il typeResolver deve essere in grado di gestire un assembly o null, perché riceverà null per Dictionary<TKey, TValue> e String. È possibile gestire tale caso chiamando un overload di GetType metodo che accetta una stringa, poiché entrambi i nomi dei tipi non qualificati sono in mscorlib. 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 assemblyResolver metodo non viene chiamato per il tipo di dizionario e il tipo di stringa, perché i nomi di tipo non sono completi di assembly.

Si supponga ora che invece di System.String, il primo tipo di argomento generico è 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 è mscorlib né nell'assembly attualmente in esecuzione, è possibile risolvere YourType senza un nome completo dell'assembly. Poiché il assemblyResolve sarà chiamato in modo ricorsivo, deve essere in grado di gestire questa situazione. Anziché restituire null per gli assembly diverso da MyAssembly, esegue il caricamento di un assembly utilizzando l'interfaccia fornita AssemblyName oggetto.

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
                      ); 

Torna alla note sull'utilizzo.

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 dell'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 per il GetType metodo. Ad esempio, se un tipo è denominato Strange]Type, il carattere di escape deve essere aggiunto prima la parentesi quadra come segue: Strange\]Type.

System_CAPS_noteNota

I nomi con caratteri speciali non possono essere creati in Visual Basic o c#, ma possono essere creati utilizzando Microsoft intermediate language (MSIL) o creazione di assembly dinamici.

Nella tabella seguente mostra i caratteri speciali per i nomi dei tipi.

Carattere

Significato

, (virgola)

Delimitatore per i nomi completi di assembly.

[] (parentesi quadre)

Come una coppia di suffisso, indica un tipo di matrice. come una coppia di delimitatori racchiude elenchi di argomenti generici e nomi completi di assembly.

& (e commerciale)

Come un suffisso, indica che un tipo è un tipo di riferimento.

* (asterisco)

Come un suffisso, indica che un tipo è un tipo di puntatore.

+ (più)

Delimitatore per i tipi annidati.

\ (barra rovesciata)

Carattere di escape.

Proprietà, ad esempio AssemblyQualifiedName restituito corretto carattere di escape stringhe. È necessario passare stringhe con caratteri di escape in modo corretto per il GetType metodo. A sua volta, il GetType metodo passa i nomi correttamente forzati a typeResolver e per i metodi di risoluzione del tipo predefinito. Se è necessario confrontare un nome a un nome senza caratteri escape in typeResolver, è necessario rimuovere i caratteri di escape.

Torna alla note sull'utilizzo.

Nella tabella seguente sono riepilogate le interazioni tra assemblyResolver, typeResolvere la risoluzione dei nomi predefinito per tutte le combinazioni di nome del tipo e assembly in typeName:

Contenuto del nome del tipo

Metodo resolver degli assembly

Metodo con tipo di sistema di risoluzione

Risultato

tipo di assembly

Null

Null

Equivale a chiamare il Type.GetType(String, Boolean, Boolean) overload del metodo.

tipo di assembly

fornito

Null

assemblyResolverRestituisce l'assembly oppure null se risulta impossibile risolvere l'assembly. Se l'assembly viene risolto, il Assembly.GetType(String, Boolean, Boolean) overload del metodo viene utilizzato per caricare il tipo dell'assembly; in caso contrario, non viene eseguito alcun tentativo per risolvere il tipo.

tipo di assembly

Null

fornito

Equivale alla conversione il nome dell'assembly in un AssemblyName oggetto e la chiamata di Assembly.Load(AssemblyName) overload del metodo per ottenere l'assembly. Se l'assembly viene risolto, viene passato a typeResolver; in caso contrario, typeResolver non viene chiamato e non esiste nessun ulteriore tentativo di risolvere il tipo.

tipo di assembly

fornito

fornito

assemblyResolverRestituisce l'assembly oppure null se risulta impossibile risolvere l'assembly. Se l'assembly viene risolto, viene passato a typeResolver; in caso contrario, typeResolver non viene chiamato e non esiste nessun ulteriore tentativo di risolvere il tipo.

tipo

null, fornito

Null

Equivale a chiamare il Type.GetType(String, Boolean, Boolean) overload del metodo. Poiché il nome dell'assembly non viene fornito, viene effettuata la ricerca solo mscorlib. dll e assembly attualmente in esecuzione. Se assemblyResolver viene fornito, viene ignorato.

tipo

null, fornito

fornito

typeResolverviene chiamato e null viene passato per l'assembly. typeResolverpuò fornire un tipo da qualsiasi assembly, inclusi gli assembly caricati per lo scopo. Se assemblyResolver viene fornito, viene ignorato.

assembly

null, fornito

null, fornito

Oggetto FileLoadException viene generata, perché il nome dell'assembly viene analizzato come se fosse un nome di tipo qualificato dall'assembly. Ciò comporta un nome di assembly non valido.

Torna alla: note sull'utilizzo, risoluzione degli assembly, la risoluzione dei tipi.

.NET Framework
Disponibile da 4.0
Torna all'inizio
Mostra: