web-dev-qa-db-fra.com

Déterminer si le type est un dictionnaire

Comment puis-je déterminer si le type est de Dictionary<,>

Actuellement, la seule chose qui a fonctionné pour moi, c'est si je connais réellement les arguments.

Par exemple:

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

Mais le dictionnaire ne sera pas toujours <string, object> alors comment puis-je vérifier s'il s'agit d'un dictionnaire sans connaître les arguments et sans avoir à vérifier le nom (car nous avons également d'autres classes qui contiennent le mot Dictionary.

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

Vous pouvez ensuite obtenir les types de clé et de valeur:

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

Vous pouvez utiliser IsAssignableFrom pour vérifier si le type implémente IDictionary.

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

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

Console.WriteLine(isDict); //prints true

Ce code affichera false pour tous les types, qui n'implémentent pas l'interface IDictionary.

5
Ilya Ivanov

Il existe un moyen très simple de le faire et vous y étiez presque.

Essaye ça:

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

que diriez-vous

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);

comme tous les types de dictionnaires génériques héritent de l'interface IDictionary, vous pouvez simplement vérifier que

1
Igarioshka