2012-08-16 13 views
9

Dies sind ähnliche Fragen: 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 aber keine Antwort funktioniert.Erhalten Sie Typ in referenzierter Assembly, indem Sie Klassenname als Zeichenfolge angeben?

Ich habe ein MVC-Projekt, das Daten aus einer Datenbank bezieht, die die einfachen Typen als Zeichenfolgen enthält. Diese Typen befinden sich in einer referenzierten Assembly, nicht im MVC-Projekt.

So zum Beispiel sagen sie, mein referenzierte Assembly-Name ist MyFramework und die Ebene Typname Car, der vollständige Typname MyFramework.Cars.Car oder MyFramework.Vehicles.Cars.Car oder eine andere Variation sein könnte. Alles, was ich habe, sind der referenzierte Assemblyname und der einfache Klassenname als Strings. Wie kann ich den Typ unabhängig vom vollständigen Typnamen erhalten?

Zum Schluss, konnte ich eine Funktion in der referenzierten Assembly schreiben, die GetType() aufruft und diese im MvC-Projekt verwendet, damit ich auf den Assemblynamen verzichten konnte? Ich möchte den Namen der Assembly zu entfernen, zu wissen, so dachte ich, dass ich eine Util in der referenzierten Versammlung wie schreiben konnte:

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

Und dann in meinem MVC-Projekt konnte ich es nennen, ohne die Baugruppe als String Namen zu benötigen. Ist das möglich oder werde ich immer den Assemblynamen brauchen?

+0

Warum funktionieren die anderen Antworten nicht? –

+0

@RobertHarvey Es ist, weil ich gerade den einfachen Klassennamen habe. Nicht der vollständige Typname. Diese Antworten beruhen auf der Kenntnis des vollständigen Typs. – SventoryMang

Antwort

19

Möglicherweise ist die referenzierte Assembly zu diesem Zeitpunkt nicht geladen. Außerdem verstehe ich aus Ihrer Frage, dass Sie nicht den vollständigen Typnamen, sondern nur den Klassennamen haben.
Sie sollten dann etwas entlang dieser Linie versuchen:

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

Hoffe, dass ich Sie richtig verstanden.

+0

Wenn ich ein Util in dieser Assembly schreibe, aber nur den Klassennamen habe, wie würde es aussehen? Ich möchte den Bedarf für den Assemblynamen entfernen, indem ich eine 'TypeUtil'-Klasse schreibe, die eine 'GetTypeFromFramework (string typeName)' Funktion haben kann. Ich dachte, wenn ich 'GetType' in dieser Assembly aufrufen würde, brauche ich die Assembly überhaupt nicht zu verwenden, aber es gibt immer noch null zurück. – SventoryMang

+0

Bitte posten Sie ein Beispiel von dem, was Sie versuchen, damit wir Ihre Situation besser verstehen können. –

+0

Ich habe die Frage bearbeitet. Deine Antwort funktioniert, wenn du sie in meinem Util verwendest. Ich bin nur neugierig, ob ich die Abhängigkeit vom Assemblynamen als String entfernen kann. Ich hatte den Eindruck, dass, wenn ich GetType() in dieser Assembly aufrufen würde, ich den Assemblynamen nicht angeben müsste, sondern einfach 'Type.GetType (Klassenname)' liefern würde, der NULL zurückgab, selbst wenn dieser Code in der referenzierte Baugruppe. – SventoryMang

9

Für die erste Frage, könnte man so etwas wie

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

Ich bin nicht sicher, was Sie mit der zweiten Frage bedeuten tun.