2013-06-06 15 views
29

Come è possibile determinare se il tipo è di Dictionary<,>Determinare se il tipo è dizionario

Attualmente l'unica cosa che ha funzionato per me è che se io in realtà conosco gli argomenti.

Ad esempio:

var dict = new Dictionary<string, object>(); 
var isDict = dict.GetType() == typeof(Dictionary<string, object>; // This Works 
var isDict = dict.GetType() == typeof(Dictionary<,>; // This does not work 

Ma il dizionario non sarà sempre <string, object> così come posso verificare se si tratta di un dizionario senza conoscere gli argomenti e senza dover controllare il nome (dal momento che abbiamo anche altre classi che contengono la parola Dictionary

+7

'Dizionario <,> oggetti' 'implementano IDictionary' quindi possibilmente 'typeof (IDictionary)'. –

+0

potrebbero esserci primitive? Non sono così familiare con C#, ma non è un discendente System.Object di ogni classe? – sschrass

risposta

54
Type t = dict.GetType(); 
bool isDict = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>); 

È quindi possibile ottenere la chiave e il valore tipi:.

Type keyType = t.GetGenericArguments()[0]; 
Type valueType = t.GetGenericArguments()[1]; 
+0

GetGenericTypeDefinitions genera un'eccezione di tipo "System.InvalidOperationException". Deve essere perché sto testandolo contro un tipo non generico. Che stupido! –

+0

@TheunArbeider - Questo dovrebbe accadere solo se il tipo non è generico, stai includendo la condizione 'IsGenericType'? – Lee

+0

Sì, ho dimenticato il tipo di alimentazione isa :) –

3

È possibile utilizzare IsAssignableFrom per verificare se il tipo implementa IDictionary.

var dict = new Dictionary<string, object>(); 

var isDict = typeof(IDictionary).IsAssignableFrom(dict.GetType()); 

Console.WriteLine(isDict); //prints true 

Questo codice stamperà false per tutti i tipi, che non implementano l'interfaccia IDictionary.

5

C'è un modo molto semplice per fare questo ed eri molto vicino.

Prova questo:

var dict = new Dictionary<string, object>(); 
var isDict = (dict.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>)) 
1

come su

Dictionary<string, object> d = new Dictionary<string, object>(); 
Dictionary<int, string> d2 = new Dictionary<int, string>(); 
List<string> d3 = new List<string>(); 

Console.WriteLine(d is System.Collections.IDictionary); 
Console.WriteLine(d2 is System.Collections.IDictionary); 
Console.WriteLine(d3 is System.Collections.IDictionary); 

come tutti i tipi generici dizionario ereditano dall'interfaccia IDictionary, si può solo controllare che

+0

Questo sembra ben fatto ma non funziona: "L'uso del tipo generico 'System.Collections.Generic.IDictionary ' richiede 2 argomenti tipo" –

+0

@BorisZinchenko copia semplicemente questo in un test e lo esegue, senza errori. E il messaggio di errore che hai dichiarato sembra che manchi un tipo nella definizione del dizionario. Come in 'Dictionary ' vs 'Dizionario ' – Igarioshka

+0

puoi vedere il tuo codice e l'errore qui: https://dotnetfiddle.net/JJpHIi –

Problemi correlati