2013-05-12 12 views
5

mam obiektu instance dla którychGet par klucz-wartość słownika, nie znając jego typ

instance.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>) 

jest prawdą. Moje pytanie brzmi: jak wyodrębnić pary klucz-wartość z tego obiektu bez znajomości ich rodzajów ogólnych? Chciałbym uzyskać coś w rodzaju KeyValuePair<object, object>[]. Zauważ, że znam również typy ogólne, których słownik używa w czasie wykonywania (ale nie podczas kompilacji). Zakładam, że jakiś rodzaj refleksji jest wymagany?

KONTYNUACJA: Czy istnieje ogólny mechanizm przekonwertować object do SomeClass<> (jeśli wiem, że jest to właściwy typ, oczywiście), a więc z niego skorzystać, biorąc pod uwagę, że realizacja tej klasy nie ma wpływu typ ogólnych argumentów?

+0

Albo nietypowy interfejs 'IDictionary'. – SLaks

+0

To dobry punkt. Szukam odpowiedzi specjalnie dla 'Dictionary <,>' ale chciałbym wiedzieć, czy istnieje sposób, w jaki mogę dynamicznie rzutować dowolny obiekt, który wymaga ogólnych argumentów, aby móc go używać. – nickolayratchev

+0

"ToList" IDictionary'a zwraca listę KeyValuePairs: 'var keyValuePairList = instance.ToList();'. Czy tego właśnie szukasz (przed kontynuacją)? Czy może czegoś brakuje? –

Odpowiedz

4

zrobiłbym co Jeremy Todd powiedział, z wyjątkiem być może trochę krócej:

foreach(var item in (dynamic)instance) 
    { 
     object key = item.Key; 
     object val = item.Value; 
    } 

I tak na marginesie (nie na pewno, jeśli jest to pomocne), możesz uzyskać następujące typy argumentów:

Type[] genericArguments = instance.GetType().GetGenericArguments(); 
+0

Chciałbym dodać, że dynamiczne może być również używane do pobierania wartości za pomocą składni indeksowania: '(myDictonary jako dynamiczne) [" someKeyValue "]' –

3

Dla szybkiego rozwiązania, można po prostu użyć dynamic:

Dictionary<string, int> myDictionary = new Dictionary<string, int>(); 

myDictionary.Add("First", 1); 
myDictionary.Add("Second", 2); 
myDictionary.Add("Third", 3); 

dynamic dynamicDictionary = myDictionary; 

foreach (var entry in dynamicDictionary) 
{ 
    object key = entry.Key; 
    object val = entry.Value; 
    ...whatever... 
} 
+1

Nie ma sposobu na rozwiązanie tego problemu bez obejścia systemu typów, ponieważ typ nie jest znany podczas kompilacji. Każde rozwiązanie wymaga czegoś w stylu "dynamicznego" lub refleksyjnego, a dwóch "dynamicznych" jest znacznie bardziej elegancko. –

+0

Lepsza odpowiedź na to pytanie brzmi: "Po prostu przeprojektuj swoje rozwiązanie?". Chcesz nam pokazać swoje rozwiązanie? Jak w ogóle wiesz, jaki jest dokładnie jego problem? Nienawidzę TYCH odpowiedzi. –

+1

Nie możesz myśleć o okolicznościach, ale OP osiągnął tę okoliczność ... –

0

Oto, co mam mnie, żeby mi pomóc. W tym czasie odpowiadało moim potrzebom ... Może to pomoże komuś innemu.

foreach (var unknown in (dynamic)savedState) 
{ 
    object dKey = unknown.Key; 
    object dValue = unknown.Value; 

    switch (dKey.GetType().ToString()) 
    { 
    case "System.String": 
     //Save the key 
     sKey = (string)dKey; 

     switch (dValue.GetType().ToString()) 
     { 
     case "System.String": 
      //Save the string value 
      sValue = (string)dValue; 

      break; 
     case "System.Int32": 
      //Save the int value 
      sValue = ((int)dValue).ToString(); 

      break; 
     } 

     break; 
    } 

    //Show the keypair to the global dictionary 
    MessageBox.Show("Key:" + sKey + " Value:" + sValue); 
} 
Powiązane problemy