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
.
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];
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
.
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<,>))
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