2012-02-14 9 views
15
Type.GetType("TheClass"); 

Zwraca null jeśli namespace nie jest obecny jak:unikać podawania nazwy przestrzeni nazw w Type.GetType()

Type.GetType("SomeNamespace.TheClass"); // returns a Type object 

Czy istnieje jakiś sposób, aby uniknąć podając nazwę namespace?

+4

Czy zdajesz sobie sprawę, że możesz mieć wiele różnych klas o nazwie TheClass w projekcie, do którego dodano wiele referencji, a plik, w którym próbujesz rozwiązać typ, zawiera wiele instrukcji użycia? Powinieneś przekazać w pełni kwalifikowaną nazwę, w tym obszar nazw, np. Gdy odwołasz się do dokumentu, który napiszesz Imię i nazwisko. Które z wielu klas TheClass powinien używać kompilator w przypadku wielu obecnych? Namespace mówi, który. –

+0

Wrzuciłbym 'ArgumentException' zamiast tylko zwrócić' null'. Nie można odróżnić bez 'Namespace' – gdoron

+0

możliwego duplikatu [Getting a System.Type z częściowej nazwy typu] (http://stackoverflow.com/questions/179102/getting-a-system-type-from-types-partial -name) – nawfal

Odpowiedz

-1

Jest to parametr, którego oczekuje metoda, więc nie. Nie możesz.

nazwa_typu: nazwa typu kwalifikowana według jej przestrzeni nazw.

MSDN

Jak można oczekiwać, aby odróżnić dwie klasy o tej samej nazwie, ale innej przestrzeni nazw?

namespace one 
{ 
    public class TheClass 
    { 
    } 
} 

namespace two 
{ 
    public class TheClass 
    { 
    } 
} 

Type.GetType("TheClass") // Which?! 
+0

Zgodnie z moimi potrzebami nie ma takiej sytuacji. –

+0

Zgodnie z moimi potrzebami nie będzie takiej sytuacji. Więc w takim razie jak mogę to zrobić? –

+4

@NIleshLanke, mam nadzieję, że zdajesz sobie sprawę, że Microsoft nie zaprojektował środowiska .NET zgodnie z ** twoimi ** potrzebami, ale zaprojektowano go do użycia w znacznie szerszych scenariuszach. Jak na przykład scenariusz, w którym masz tę samą nazwę klasy w dwóch różnych obszarach nazw. –

39

Użyłem metody pomocnika, który wyszukuje wszystkie załadowane Assembly s dla Type odpowiadającej określonej nazwie. Mimo że w moim kodzie oczekiwano tylko jednego wyniku typu, który obsługuje wiele. Weryfikuję, że tylko jeden wynik jest zwracany za każdym razem, gdy go używałam i sugeruję, abyś zrobił to samo.

/// <summary> 
/// Gets a all Type instances matching the specified class name with just non-namespace qualified class name. 
/// </summary> 
/// <param name="className">Name of the class sought.</param> 
/// <returns>Types that have the class name specified. They may not be in the same namespace.</returns> 
public static Type[] getTypeByName(string className) 
{ 
    List<Type> returnVal = new List<Type>(); 

    foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     Type[] assemblyTypes = a.GetTypes(); 
     for (int j = 0; j < assemblyTypes.Length; j++) 
     { 
      if (assemblyTypes[j].Name == className) 
      { 
       returnVal.Add(assemblyTypes[j]); 
      } 
     } 
    } 

    return returnVal.ToArray(); 
} 
+19

+1 za udzielenie odpowiedzi na pytanie zamiast układania w wojnę o płomień powyżej. –

+2

Kolejna odpowiedź, która pochodzi od kogoś, kto wie, zamiast nie używać pustej przestrzeni nazw bla bla :) dla odpowiedzi – MonsterMMORPG

+0

fantastycznie, robi to, co mówi. Główną rzeczą, którą chciałbym dodać do tego byłoby użycie assemblyTypes [j] .Name.EqualsIgnoreCase (className). – sirthomas

Powiązane problemy