5

Da microsoft documentation, Type.GetType può essere case-insensitive in .NET 4.5. Sfortunatamente, questo non è disponibile in WinRT (Metro/Modern UI/App Store).Type.GetType case insensitive - WinRT

Esiste una soluzione nota? Perché devo istanziare oggetti da un protocollo che ha tutte le rappresentazioni di stringa in maiuscolo.

Esempio: da "MYOBJECT", devo istanziare MyObject.

Attualmente utilizzo Activator.CreateInstance(Type.GetType("MYOBJECT")), ma a causa della sensibilità del case, non funziona.

Grazie

risposta

5

Conoscete l'assieme da cui caricate i tipi? In tal caso, è sufficiente creare una distinzione tra maiuscole e minuscole Dictionary<string, Type> (utilizzando StringComparer.OrdinalIgnoreCase) chiamando il numero Assembly.GetTypes() una volta. Quindi non c'è bisogno di usare Type.GetType() a tutti - basta consultare il dizionario:

// 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: Dopo aver visto che questi sono tutti nello stesso namespace, si può facilmente filtrare che:

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

@NicolasVoron: perché dovrebbe essere doloroso? Quanti tipi ci sono e quanti stai andando a prendere? (Supponevo che stavi recuperando molti tipi diversi per nome.) –

+0

Hmmm ... Totalmente frainteso la tua risposta. Mi dispiace per quello Questa è un'ottima soluzione. La tua modifica si adatta perfettamente alle mie esigenze;) Grazie mille! –

4

È possibile utilizzare il metodo GetTypes() per recuperare tutti i tipi possibili nell'assieme in cui si trova il tipo, dopo di che il tipo maiuscolo è uguale al proprio maiuscolo, quindi utilizzarlo nel metodo GetType.

0

Si consideri che il nome effettivo della classe è Car e la stringa di query è CAR. Poiché questi sono diversi in termini di maiuscole e minuscole, Type.GetType() restituirà null. Per risolvere questo, innanzitutto filtrare tutte le classi dallo spazio dei nomi di Car (Supponiamo che lo spazio dei nomi sia Vehicle).

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

convertire in List

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

dichiarare una variabile per ottenere il nome effettivo della classe e utilizzare un ciclo per confrontare stringa senza maiuscole e minuscole.

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

Ora con la nuova stringa, utilizzare il Type.GetType()

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