2011-09-11 13 views
5

Sto cercando di individuare un tipo in fase di esecuzione da un elenco di assiemi; il mio codice è qualcosa del genere:Perché Type.GetType() funziona e Assembly.GetType() non funziona?

foreach (Assembly assembly in assembliesToSearch) 
{ 
    Type t = assembly.GetType(assemblyName); 
    if (t != null) 
    { 
     return t; 
    } 
} 

e il problema che ho è che t è sempre in arrivo come null. Giocare con il debugger e la finestra intermedia in VS2010, ho notato quanto segue quando ho messo un punto di interruzione all'interno del ciclo:

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

funziona bene, ma

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

non lo fa (quando il montaggio è il assembly che conosco contiene la classe che sto cercando - nel debugger, posso mettere un watch su assembly.GetTypes(), navigare nella classe che sto cercando di istanziare e chiamare assembly.GetType ("MyNamespace.MyClass , MyNamespace ")).

Qualcuno sa perché la ricerca di tutti gli assembly utilizzando Type.GetType() funziona, ma la ricerca dell'assembly che conosco contiene il tipo utilizzando assembly.GetType() no?

risposta

9

Dalla documentazione MSDN per i due metodi, Type.GetType() aspetta un nome assemblaggio qualificato di un tipo cheAssembly.GetType() aspetta il nome completo del tipo. Queste non sono la stessa cosa

typeof(MyNamespace.MyClass).AssemblyQualifiedName viene valutato come un nome di assembly qualificato di un tipo (si parla di MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral), in modo che non funziona con il Assembly.GetType() chiamata che è in attesa di una stringa nel formato MyNamespace.MyClass.

Questo è probabilmente dovuto al fatto che quando si passa il nome qualificato all'assembly alla chiamata Assembly.GetType(), è in cerca di un tipo nell'assembly il cui nome completo corrisponda a ciò che è stato fornito. Non riesce a trovarne uno, quindi viene restituito null. Questo non è il caso della chiamata Type.GetType() poiché si aspetta di ottenere un nome qualificato di un assembly di un tipo e di poter individuare sia l'assembly che il tipo.


Qualcosa da notare:

Se si sta "tentando di individuare un tipo in fase di esecuzione da un elenco di gruppi", come dici tu, si sono probabilmente meglio utilizzando la chiamata Assembly.GetType() su ciascun gruppo nel elencare e passare il nome completo del tipo. Type.GetType() molto probabilmente utilizzerà i riferimenti dell'assembly corrente per risolvere il tipo, quindi se il tipo esiste in un assembly che non è un riferimento, non verrà trovato.

+0

Grazie per la risposta; il mio esempio di codice iniziale non lo mostra chiaramente, ma all'interno del mio ciclo in cui sto chiamando Type t = assembly.GetType (assemblyName), assemblyName è "MyNamespace.MyClass, MyAssembly", quindi secondo i miei calcoli, dovrebbe tornare il tipo previsto. –

+0

@David: 'MyNamespace.MyClass, MyAssembly' è ancora un nome di tipo qualificato per assembly. È necessario eliminare il nome dell'assembly da quella stringa affinché funzioni con 'Assembly.GetType()'. – adrianbanks

+0

@adrianbanks - dove hai imparato "Type.GetType() molto probabilmente utilizzerà i riferimenti dell'assembly corrente per risolvere il tipo" - non sembra essere nel [MSDN qui] (http: // msdn .microsoft.com/en-us/library/w3f99sx1 (v = vs.110) aspx). Inoltre, qual è il "montaggio corrente"? Nel caso che sto guardando ora, l'assemblaggio con il tipo - che si trova! - non è l'assembly con il metodo attualmente eseguito e non è un riferimento di esso ... ma è un assembly sullo stack di chiamate.(La ragione della mia domanda: La versione nel mio nome assembly è sbagliata ma il tipo è stato trovato.) – davidbak