2012-08-16 16 views
9

To są podobne pytania: 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, ale żadna odpowiedź nie działa.Pobierz typ w zestawie referencyjnym, podając nazwę klasy jako ciąg?

Mam projekt MVC, który pobiera dane z bazy danych, która zawiera typy zwykłe jako ciągi. Te typy znajdują się w zespole referencyjnym, a nie w projekcie MVC.

Tak na przykład powiedzmy moja odniesione Nazwa Zgromadzenie jest MyFramework a zwykły nazwa typu Car, pełna nazwa typu może być MyFramework.Cars.Car lub MyFramework.Vehicles.Cars.Car lub jakaś inna odmiana. Wszystko, co mam, to referencyjna nazwa zespołu i prosta nazwa klasy jako ciągi. Jak mogę uzyskać typ bez względu na pełną nazwę typu?

Wreszcie, czy mógłbym napisać funkcję w zestawie referencyjnym, która wywołuje metodę GetType() i użyć jej w projekcie MvC, abym mógł zrezygnować z nazwy zestawu? Chcę usunąć znając nazwę zespołu tak myślałem, mógłbym napisać Util w odwołuje montażu jak:

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

A potem w moim projekcie MVC mogę nazwać to bez konieczności montażu jako nazwy strun. Czy to możliwe, czy zawsze będę potrzebować nazwy zespołu?

+0

Dlaczego inne odpowiedzi nie zadziałały? –

+0

@RobertHarvey To dlatego, że mam po prostu zwykłą nazwę klasy. To nie jest pełna nazwa typu. Te odpowiedzi polegają na znajomości pełnego typu. – SventoryMang

Odpowiedz

19

Być może zestaw referencyjny nie został załadowany w tym czasie. Ponadto z twojego pytania wynika, że ​​nie masz pełnej nazwy typu, a jedynie nazwę klasy.
Należy spróbować czegoś wzdłuż tej linii, a następnie:

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

nadzieję, że zrozumiałem.

+0

Jeśli napiszę Util w tym zestawie, ale nadal będę miał tylko nazwę klasy, jak by to wyglądało? Chciałbym usunąć potrzebę nazwy zespołu, pisząc klasę 'TypeUtil', która może mieć funkcję' GetTypeFromFramework (string typeName) '. Pomyślałem, że jeśli wezwę "GetType" w tym zestawie, nie będę musiał w ogóle używać tego zestawu, ale nadal zwraca on wartość null. – SventoryMang

+0

Prosimy o przesłanie próbki tego, co próbujesz zrobić, abyśmy mogli lepiej zrozumieć Twoją sytuację. –

+0

Edytowałem pytanie. Twoja odpowiedź działa, gdy używasz go w moim Util. Jestem tylko ciekawy, czy mogę usunąć zależność od nazwy zespołu jako ciąg. Miałem wrażenie, że gdybym nazwał GetType() w tym zestawie, nie musiałbym podawać nazwy zespołu, ale po prostu dostarczając 'Type.GetType (nazwa klasy)' wracał zwracając wartość null, nawet gdy ten kod był w zespół referencyjny. – SventoryMang

9

Na pierwsze pytanie, można zrobić coś takiego

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

Nie jestem pewien co masz na myśli przez drugie pytanie.