Определите, является ли тип словарем [дубликат]

На этот вопрос уже есть ответ здесь:

Проверка, является ли объект словарём в C # 7 ответов

Как я могу определить, имеет ли типDictionary

В настоящее время единственное, что сработало для меня, - это если я действительно знаю аргументы.

Например:

var dict = new Dictionary();
var isDict = dict.GetType() == typeof(Dictionary; // This Works
var isDict = dict.GetType() == typeof(Dictionary; // This does not work

Но словарь победилт всегда быть так как я могу проверить,s словарь, не зная аргументов и не проверяя имя (поскольку у нас также есть другие классы, содержащие слово.Dictionary

 Ash Burlaczenko06 июн. 2013 г., 10:15
Dictionary объекты реализуютIDictionary так возможно.typeof(IDictionary)
 sschrass06 июн. 2013 г., 10:20
могут ли быть примитивы? Я не очень знаком с C #, но нет каждый класс потомок System.Object?

Ответы на вопрос(4)

Попробуй это:

var dict = new Dictionary<string, object="">();
var isDict = (dict.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>))
</string,>
 Alex Klaus02 окт. 2018 г., 02:27
Нет, сначала нужно проверить, является ли тип универсальным. В противном случае вы можете получитьInvalidOperationException: 'This operation is only valid on generic types.'
Решение Вопроса
Type t = dict.GetType();
bool isDict = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>);

Type keyType = t.GetGenericArguments()[0];
Type valueType = t.GetGenericArguments()[1];
 Theun Arbeider06 июн. 2013 г., 10:24
Да, забыл isgenerictype :)
 Almo09 июл. 2015 г., 21:20
Почему этот ответ не заканчивается в дубликате? Я думаю, что так и должно быть.
 Lee06 июн. 2013 г., 10:19
@TheunArbeider - это должно произойти только в том случае, если тип не является универсальным.IsGenericType состояние?
 NightOwl88819 апр. 2017 г., 16:13
Это было чрезвычайно полезно, но мне не хватает последней части, которая мне нужна - преобразование неизвестного объекта вDictionary, Это можно сделать с помощью.dynamic genericType = Convert.ChangeType(obj, t);
 Theun Arbeider06 июн. 2013 г., 10:18
GetGenericTypeDefinitions создает исключение типа "System.InvalidOperationException», Должно быть потому, что яя тестирую его на не универсальный тип. Глупый я!

Ты можешь использоватьIsAssignableFrom проверить, реализует ли тип.IDictionary

var dict = new Dictionary();

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

Console.WriteLine(isDict); //prints true

Этот код будет печатать false для всех типов, которые нереализоватьIDictionary интерфейс.

как насчет

Dictionary d = new Dictionary();
Dictionary d2 = new Dictionary();
List d3 = new List();

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

так как все универсальные типы словаря наследуются от интерфейса IDictionary, вы можете просто проверить, что

 Igarioshka28 февр. 2018 г., 21:11
Ошибка, требующая общих параметров, существует потому, что компилятор считает, что вы хотите использоватьSystem.Collections.Generic.IDictionary без типов. в моем примере я использую не универсальный интерфейсSystem.Collections.IDictionary;, Также, если вы посмотрите на определение универсального класса Dictionary, он реализует неуниверсальный интерфейс IDictionary согласнодокументация.
 Boris Zinchenko02 мар. 2018 г., 10:21
Большое спасибо за разъяснения. Код скомпилирован правильно с явным разрешением пространства имен. Я отредактировал ваш ответ, чтобы другие не были сбиты с толку, как я.
 Igarioshka25 февр. 2018 г., 21:03
@BorisZinchenko просто скопируйте, вставьте это в тест и запустите без ошибок. И сообщение об ошибке, которое вы указали, похоже, что вам не хватает Type в определении словаря. Как вDictionary противDictionary
 Boris Zinchenko26 февр. 2018 г., 10:35
Вы можете увидеть свой код и ошибку здесь:dotnetfiddle.net/JJpHIi
 Boris Zinchenko25 февр. 2018 г., 17:25
Это выглядит красиво, но не работает: "Использование универсального типаSystem.Collections.Generic.IDictionary <TKey, TValue>» требует 2 аргументов типа

Ваш ответ на вопрос