Подтвердить что ты не робот

Определить, является ли тип словарем

Как определить, имеет ли тип 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.

4b9b3361

Ответ 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, вы можете просто проверить, что