2013-06-06 14 views
29

Jak mogę sprawdzić, czy typ jest Dictionary<,>Sprawdź, czy typ jest słownik

Obecnie jedyną rzeczą, która pracowała dla mnie, gdybym rzeczywiście znać argumenty.

Na przykład:

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 

Ale słownik nie zawsze będzie <string, object> więc jak mogę sprawdzić, czy jest to słownik nie wiedząc argumenty i bez konieczności sprawdzić nazwę (ponieważ mamy także inne klasy które zawierają słowo Dictionary

+7

'Słownik <,>' 'IDictionary' obiekty wdrożenia więc prawdopodobnie 'typeof (IDictionary)'. –

+0

czy mogą istnieć prymitywy? Nie jestem zaznajomieni z C#, ale nie jest każda klasa potomek System.Object? – sschrass

Odpowiedz

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

następnie można dostać klucz i wartość typów.

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

GetGenericTypeDefinitions zgłasza wyjątek typu "System.InvalidOperationException". Musi być, ponieważ testuję go przeciwko typowi nietypowemu. Głupi ja! –

+0

@ TheunArbeider - To powinno się zdarzyć tylko wtedy, gdy typ nie jest ogólny, czy obejmuje warunek 'IsGenericType'? – Lee

+0

Tak, zapomniałem isgenerictype :) –

3

Możesz użyć IsAssignableFrom, aby sprawdzić, czy typ implementuje IDictionary.

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

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

Console.WriteLine(isDict); //prints true 

Ten kod będzie drukował fałszywe dla wszystkich typów, które nie implementują interfejsu IDictionary.

5

Jest to bardzo prosty sposób, aby to zrobić i byłeś bardzo blisko.

Spróbuj tego:

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

jak o

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

jak wszystkich głównych rodzajów Słownik dziedziczyć z interfejsu IDictionary, może po prostu sprawdzić, czy

+0

To wygląda ładnie, ale nie działa: "Używanie typowego typu" System.Collections.Generic.IDictionary "wymaga 2 argumentów typu" –

+0

@BorisZinchenko wystarczy skopiować wkleiłem to do testu i uruchomiłem, bez błędów. I komunikat o błędzie, który podałeś, wygląda na to, że brakuje Ci typu w definicji słownika. Jak w 'Dictionary ' vs 'Słownik ' – Igarioshka

+0

możesz zobaczyć swój kod i błąd tutaj: https://dotnetfiddle.net/JJpHIi –