2012-08-16 18 views
9

Queste sono domande simili: How-to: Load a type from a referenced assembly at runtime using a string in Silverlight, GetType on a class in a referenced assembly fails ma nessuna risposta funziona.Ottieni il tipo nell'assembly referenziato fornendo il nome della classe come stringa?

Ho un progetto MVC che estrae i dati da un database che include i tipi semplici come stringhe. Questi tipi sono in un assembly referenziato, non nel progetto MVC.

Così, per esempio diciamo che il mio con riferimenti a nome dell'Assemblea è MyFramework e il tipo di nome pianura Car, il nome del tipo completo potrebbe essere MyFramework.Cars.Car o MyFramework.Vehicles.Cars.Car o qualche altra variazione. Tutto quello che ho sono il nome dell'assembly di riferimento e il nome della classe semplice come stringhe. Come posso ottenere il tipo indipendentemente dal nome completo del tipo?

Infine, è possibile scrivere una funzione nell'assieme di riferimento che chiama GetType() e utilizzarla nel progetto MvC in modo da poter rinunciare a includere il nome dell'assembly? Voglio rimuovere conoscere il nome di assemblaggio così ho pensato che avrei potuto scrivere un Util nell'Assemblea si fa riferimento come:

namespace MyFramework //the referenced assembly 
{ 
    public static class TypeUtil 
    { 
    public static Type GetFrameworkType(string typeName) 
    { 
     return Type.GetType(typeName); 
    } 
    } 
} 

E poi nel mio progetto MVC ho potuto chiamarla senza bisogno l'assembly come un nome di stringa. È possibile o avrò sempre bisogno del nome dell'assembly?

+0

Perché le altre risposte non funzionano? –

+0

@RobertHarvey È perché ho solo il nome di classe semplice. Non il nome completo del tipo. Queste risposte si basano sulla conoscenza del tipo completo. – SventoryMang

risposta

19

Forse l'assembly di riferimento non è caricato in quel momento. Inoltre, capisco dalla tua domanda che non hai il nome completo del tipo, solo il nome della classe.
Si dovrebbe provare qualcosa su questa linea allora:

Type type = Assembly.Load("YourAssemblyName").GetTypes().First(t => t.Name == "ShortTypeName"); 

Speranza ho capito bene.

+0

Se scrivo un Util in quell'assembly ma ho ancora solo il nome della classe, come sarebbe? Vorrei rimuovere la necessità del nome dell'assembly scrivendo una classe 'TypeUtil' che possa avere una funzione' GetTypeFromFramework (string typeName) '. Ho pensato che se chiamassi 'GetType' in quell'assembly, non ho bisogno di usare l'assembly, ma restituisce comunque null. – SventoryMang

+0

Si prega di inviare un esempio di ciò che stai cercando di fare, in modo da poter meglio comprendere la vostra situazione. –

+0

Ho modificato la domanda. La tua risposta funziona quando la usi nel mio Util. Sono curioso di sapere se posso rimuovere la dipendenza dal nome dell'assembly come una stringa. Avevo l'impressione che se avessi chiamato GetType() in quell'assembly, non avrei avuto bisogno di fornire il nome dell'assembly, ma semplicemente fornendo 'Type.GetType (nome classe)' continuava a restituire null, anche quando questo codice era nel assemblea referenziata. – SventoryMang

9

Per la prima domanda, si potrebbe fare qualcosa di simile

Type t = AppDomain.CurrentDomain.GetAssemblies() 
           .Where(a => a.FullName == "MyFramework") 
           .SelectMany(a => a.GetTypes()) 
           .Where(t => t.Name == "Car") 
           .FirstOrDefault(); 

Non sono sicuro di cosa si intende per la seconda questione.