2011-09-11 13 views
5

Próbuję zlokalizować typ w czasie wykonywania z listy zestawów; mój kod jest mniej więcej taki:Dlaczego funkcja Type.GetType() działa, a Assembly.GetType() nie działa?

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

, a problem, który mam, polega na tym, że t zawsze ma wartość zerową. Zabawy z debuggera i okna Pośredniczącej w VS2010, zauważyłem następujące kiedy mogę umieścić punkt przerwania wewnątrz pętli:

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

działa OK, ale

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

nie (gdy montaż jest zestaw, który znam, zawiera klasę, której szukam - w debugerze mogę umieścić zegarek na assembly.GetTypes(), przejrzyj klasę, którą próbuję utworzyć i wywołaj assembly.GetType ("MyNamespace.MyClass , MyNamespace ")).

Czy ktoś wie, dlaczego przeszukiwanie wszystkich złożeń przy użyciu Type.GetType() działa, ale wyszukiwanie złożenia, które wiem, zawiera typ przy użyciu assembly.GetType() nie?

Odpowiedz

9

Od docs MSDN dla obu metod, Type.GetType() oczekuje montaż kwalifikowana nazwa typu natomiast Assembly.GetType() oczekuje pełnej nazwy typu. To nie jest to samo.

typeof(MyNamespace.MyClass).AssemblyQualifiedName ocenia na nazwę zespołu wykwalifikowanych typu (coś jak MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral), więc to nie działa z wezwaniem Assembly.GetType() który spodziewa się ciąg w formacie MyNamespace.MyClass.

Jest to prawdopodobnie spowodowane faktem, że po przekazaniu nazwy kwalifikowanej do zestawu do wywołania Assembly.GetType(), szuka typ w zestawie, którego pełna nazwa jest zgodna z podanym. Nie można go znaleźć, więc otrzymasz zwrot: null. Nie dzieje się tak w przypadku wywołania Type.GetType(), ponieważ oczekuje uzyskania nazwy kwalifikowanej do zestawu typu i może zlokalizować zarówno złożenie, jak i typ.


Coś do uwaga:

Jeśli „próbuje zlokalizować typ w czasie wykonywania z listy zespołów”, jak mówisz, jesteś prawdopodobnie lepiej wyłączyć za pomocą połączenia Assembly.GetType() na każdego zespołu w lista i przekazywanie w pełnym imionach typu. Type.GetType() najprawdopodobniej będzie używał referencji aktualnie montowanego, aby rozwiązać typ, więc jeśli typ istnieje w zespole, który nie jest odniesieniem, nie zostanie znaleziony.

+0

Dzięki za odpowiedź; moja początkowa próbka kodu nie pokazuje tego wyraźnie, ale w mojej pętli, w której dzwonię, Type t = assembly.GetType (assemblyName), assemblyName to "MyNamespace.MyClass, MyAssembly", więc według moich obliczeń powinien być zwrócony spodziewać Typ. –

+0

@David: 'MyNamespace.MyClass, MyAssembly' nadal jest nazwą typu o kwalifikacjach zespołu. Musisz usunąć nazwę zestawu z tego łańcucha, aby działał z 'Assembly.GetType()'. – adrianbanks

+0

@adrianbanks - gdzie dowiedziałeś się, że "Typ.GetType() najprawdopodobniej będzie używał referencji aktualnie montowanych do rozwiązania typu" - nie wydaje się być w [tutaj MSDN] (http: // msdn .microsoft.com/en-us/library/w3f99sx1 (v = vs.110) .aspx). Co to jest "obecny montaż"? W przypadku, gdy patrzę teraz, zespół z typem - który został znaleziony! - nie jest zbiorem z aktualnie wykonywaną metodą i nie jest odniesieniem do niego ... ale jest zbiorem na stosie wywołań.(Powód mojego pytania: Wersja w mojej nazwie zespołu jest błędna, ale typ został znaleziony.) – davidbak

Powiązane problemy