Определить, является ли тип словарем
Как определить, имеет ли тип Dictionary<,>
В настоящее время единственное, что сработало для меня, - это если я действительно знаю аргументы.
Например:
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
Но словарь не всегда будет <string, object>
, так как я могу проверить, не является ли он словарем, не зная аргументов и не проверяя имя (поскольку у нас также есть другие классы, содержащие слово Dictionary
.
Ответы
Ответ 1
Type t = dict.GetType();
bool isDict = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>);
Затем вы можете получить ключи и типы значений:
Type keyType = t.GetGenericArguments()[0];
Type valueType = t.GetGenericArguments()[1];
Ответ 2
Существует очень простой способ сделать это, и вы были почти там.
Попробуйте следующее:
var dict = new Dictionary<string, object>();
var isDict = (dict.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>))
Ответ 3
Вы можете использовать IsAssignableFrom
, чтобы проверить, реализует ли тип IDictionary
.
var dict = new Dictionary<string, object>();
var isDict = typeof(IDictionary).IsAssignableFrom(dict.GetType());
Console.WriteLine(isDict); //prints true
Этот код напечатает false для всех типов, которые не реализуют интерфейс IDictionary
.
Ответ 4
как насчет
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 IDictionary);
Console.WriteLine(d2 is IDictionary);
Console.WriteLine(d3 is IDictionary);
поскольку все общие типы словарей наследуются от интерфейса IDictionary, вы можете просто проверить, что