5

Od microsoft documentation, Type.GetType wielkość liter nie może być rozróżniana w .NET 4.5. Niestety nie jest to dostępne w WinRT (aplikacje Metro/Modern UI/Store).Typ.GetType wielkość liter nie ma znaczenia - WinRT

Czy istnieje znane obejście tego problemu? Ponieważ muszę wywoływać obiekty z protokołu, który ma wszystkie reprezentacje ciągów wielkimi literami.

Przykład: z "MYOBJECT", muszę utworzyć instancję MyObject.

Obecnie używam Activator.CreateInstance(Type.GetType("MYOBJECT")), ale z powodu rozróżniania wielkości liter nie działa.

Dzięki

Odpowiedz

5

Czy znasz zespół, z którego ładujesz typy? Jeśli tak, możesz po prostu utworzyć niewrażliwe na wielkość liter Dictionary<string, Type> (używając StringComparer.OrdinalIgnoreCase), dzwoniąc pod numer Assembly.GetTypes(). Wtedy nie trzeba używać Type.GetType() w ogóle - po prostu zajrzyj do słownika:

// You'd probably do this once and cache it, of course... 
var typeMap = someAssembly.GetTypes() 
          .ToDictionary(t => t.FullName, t => t, 
             StringComparer.OrdinalIgnoreCase); 

... 

Type type; 
if (typeMap.TryGetValue(name, out type)) 
{ 
    ... 
} 
else 
{ 
    // Type not found 
} 

EDIT: Widząc, że są w tej samej przestrzeni nazw, można łatwo filtrować że:

var typeMap = someAssembly.GetTypes() 
          .Where(t => t.Namespace == "Foo.Bar") 
          .ToDictionary(t => t.Name, t => t, 
             StringComparer.OrdinalIgnoreCase); 
+0

@NicolasVoron: Dlaczego byłoby bolesne? Ile jest typów i ile ich ściągasz? (Zakładam, że ściągasz wiele różnych typów po imieniu.) –

+0

Hmmm ... Całkowicie źle zrozumiałem twoją odpowiedź. Przepraszam za to. To bardzo dobre rozwiązanie. Twoja edycja idealnie pasuje do moich potrzeb;) Wielkie dzięki! –

4

Możesz użyć metody GetTypes(), aby pobrać wszystkie możliwe typy w zespole, w którym znajduje się twój typ, po tym sprawdzeniu, który typ jest pisany wielkimi literami, a następnie użyj go w metodzie GetType.

0

Należy wziąć pod uwagę, że aktualna nazwa klasy to Car, a ciąg zapytania to CAR. Ponieważ są one różne pod względem wielkości liter, Type.GetType() zwróci wartość null. Aby rozwiązać ten problem, najpierw odfiltruj wszystkie klasy z przestrzeni nazw Car (Załóż, że przestrzeń nazw to Vehicle).

var varClasses = from t in Assembly.GetExecutingAssembly().GetTypes() 
       where t.IsClass && t.Namespace == "Vehicles" 
       select t; 

Konwersja do List

List<Type> lstClasses = varClasses.ToList(); 

Zadeklaruj zmienną aby uzyskać rzeczywistą nazwę klasy i użyć pętli porównać ciąg bez orzecznictwa wrażliwości.

string strActualName = ""; 
foreach (Type t in lstClasses) 
{ 
    if (t.Name.ToLower() == "CAR".ToLower()) 
    { 
      strActualName = t.Name; 
      break; 
    } 
} 

Teraz z nowego napisu, użyj Type.GetType()

Type t1 = Type.GetType("Vehicles." + strActualName); 
Powiązane problemy