2012-10-17 15 views
5

Dato che ho un tipo "Wibble.Wobble" che esiste in un assembly "Foo.Bar"esistenti di classe/metodo per l'analisi Tipo nome completo

E che assembly non viene caricato nel principali applicazioni contesto carico

esiste un meccanismo di pubblica esistente per l'analisi del seguente stringa nelle sue parti successive:

"Wibble.Wobble, Foo.Bar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xyz" 

la ragione di chiedere è che Ho bisogno di caricare una varietà di tipi in fase di esecuzione, alcuni dei quali potrebbero trovarsi nel contesto di caricamento corrente. Potrebbe essere necessario caricare altri da un assieme esterno.

So come caricare i tipi dal contesto di carico corrente Type.GetType("typename"), so come caricare un assembly e ottenere un tipo da esso Assembly.LoadFile("xyz").GetType("abc"). Quello che sto avendo problemi è che se provate a caricare un tipo da un assembly non dovrebbe essere un nome completo dove è possibile quando si utilizza Type.GetType.

La soluzione non dovrebbe essere così complicata, è sufficiente suddividere la stringa prima della prima virgola. Tuttavia, volevo sapere se c'era un modo per ottenere il nome completo come rappresentazione di un oggetto, quindi non dovevo farlo e sarebbe stato utile per localizzare l'assembly corretto senza dover scorrere un'intera directory.

risposta

1

Dopo tutti i miei scavi in ​​giro non credo ci sia nulla di pubblicamente disponibile nel Framework che possa farlo. Mi piacerebbe che qualcuno mi mostrasse in modo diverso perché preferisco utilizzare la funzionalità di base che è (o dovrebbe essere) meglio testata e scritta da qualcuno che ha una migliore comprensione del framework rispetto a me.

Come tale ho arrotolato il mio oggetto TypeName fortemente digitato.

class TypeName 
{ 
    public TypeName(string name) 
    { 
     var index = name.LastIndexOf(','); 
     if (index > 0) 
     { 
      Name = name.Substring(0, index).Trim(); 

      AssemblyName = new AssemblyName(name.Substring(index + 1).Trim()); 
     } 
     else 
     { 
      Name = name;  
     } 
    } 

    public string Name { get; private set; } 

    public AssemblyName AssemblyName { get; private set; } 
} 

L'oggetto prende in string che dovrebbe essere un nome tipo o un nome di tipo completo. Se si tratta di un nome di tipo completo, l'attributo AssemblyName viene impostato utilizzando la classe AssemblyName, altrimenti viene lasciato come null.

+1

indexof fornisce la prima occorrenza di una virgola, che potrebbe essere utilizzata come separatore negli argomenti generici. Non sarebbe bello –

+0

@DavidSchmitt Fair point, non ho ancora avuto a che fare con questo scenario ma ho aggiornato l'esempio per usare LastIndexOf invece di IndexOf. Grazie per il consiglio. – Bronumski

+1

Con LastIndexOf, potrebbe non funzionare mai, si consideri System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 l'ultimo indice di otterrà solo la parte PublicKeyToken – Alex

Problemi correlati