5

Von microsoft documentation, Type.GetType kann in .NET 4.5 case-insensitive sein. Leider ist dies nicht in WinRT (Metro/Modern UI/Store Apps) verfügbar.Type.GetType case insensitive - WinRT

Gibt es eine bekannte Problemumgehung? Weil ich Objekte aus einem Protokoll instanziieren muss, die alle String-Darstellungen in Großbuchstaben haben.

Beispiel: von "MYOBJECT", muss ich MyObject instanziieren.

Ich verwende derzeit Activator.CreateInstance(Type.GetType("MYOBJECT")), aber aufgrund der Groß-/Kleinschreibung reagiert es nicht.

Danke

Antwort

5

Kennen Sie die Baugruppe, von der Sie die Typen laden? Wenn dies der Fall ist, können Sie nur Dictionary<string, Type> (unter Verwendung von StringComparer.OrdinalIgnoreCase) durch einmaliges Aufrufen von Assembly.GetTypes() ohne Berücksichtigung der Groß- und Kleinschreibung erstellen. Dann brauchen Sie nicht Type.GetType() überhaupt zu benutzen - wenden nur das Wörterbuch:

// 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: gesehen zu haben, dass diese alle im gleichen Namensraum sind, können Sie einfach, dass filtern:

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

@NicolasVoron: Warum es schmerzhaft sein würde? Wie viele Arten gibt es und wie viele holen Sie? (Ich nahm an, dass Sie viele verschiedene Typen mit Namen holten.) –

+0

Hmmm ... Ihre Antwort total missverstanden. Das tut mir leid. Dies ist eine sehr gute Lösung. Ihre Bearbeitung passt perfekt zu meinen Bedürfnissen;) Vielen Dank! –

4

Sie können die Methode GetTypes() verwenden, um alle möglichen Typen in der Baugruppe abzurufen, in der sich Ihr Typ befindet, danach prüfen, welcher Typ Großbuchstabe Ihrem Typ Großbuchstabe entspricht, und dann in GetType Methode verwenden.

0

Beachten Sie, dass Sie tatsächliche Klassenname Car ist und Ihre Abfragezeichenfolge ist CAR. Da diese hinsichtlich der Berücksichtigung der Groß-/Kleinschreibung unterschiedlich sind, gibt Type.GetType() null zurück. Um dies zu beheben, filtern Sie zunächst alle Klassen aus dem Namespace Car (angenommen, dass der Namespace Vehicle ist).

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

Konvertieren zu einem List

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

Deklarieren Sie eine Variable die tatsächlichen Namen der Klasse zu erhalten und eine Schleife verwenden Zeichenfolge ohne Fall-Empfindlichkeit zu vergleichen.

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

Jetzt mit dem neuen String, verwenden Sie die Type.GetType()

Type t1 = Type.GetType("Vehicles." + strActualName);