C# cast Dictionary<string, AnyType> zu Dictionary<string, Object> (Mit Reflexion)
Ist es möglich zu werfen Dictionary<string, Anything>
zu einem konsistenten intermediate, generischer Typ? Also ich wäre in der Lage zu werfen <string, string>
, <string, bool>
, <string, int>
, <string, anything>
alle auf den gleichen Typ von Wörterbuch?
Arbeite ich an einem Projekt, das mit schweren Reflexion und ich muss in der Lage sein, um Prozess-DIctionary-Typen wie folgt:
FieldInfo field = this.GetType().GetField(fieldName);
Dictionary<string, Object> dict = (Dictionary<string, Object>)field.GetValue(this);
Dem obigen code ist das, was ich derzeit habe und das Programm schlägt immer fehl bei der Besetzung von Feld.GetValue auf der generischen Dictionary<string, Object>
.
Gibt es eine Möglichkeit, dies zu tun? Oder sollte ich Sie einfach heraus, einen anderen Weg, um diese Prozess-Wörterbücher?
Jegliche Hilfe würde sehr geschätzt werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgenden AakashM Antwort, der Cast scheint nicht, um ball zu spielen. Sie können es umgehen, indem eine kleine Helfer-Methode aber:
Dem duck-typing in foreach ist praktisch in diesem Fall.
Ist das hilft Ihnen ?
Selbst wenn Sie könnte einen Weg finden, um dies auszudrücken, wäre es die falsche Sache zu tun - es ist nicht wahr, dass ein
Dictionary<string, bool>
ist eineDictionary<string, object>
, so dass wir definitiv nicht wollen, zu cast. Bedenken Sie, dass, wenn wir könnte cast, wir könnten versuchen, und setzen einstring
als ein Wert, der offensichtlich nicht fit!Was wir jedoch tun können, ist eine Umwandlung in die nicht-generische
IDictionary
(die alleDictionary<,>
s implementieren), verwenden Sie dann zu konstruieren, ein neueDictionary<string, object>
mit den gleichen Werten:(beachten Sie, dass Sie nicht verwenden können
.Cast<DictionaryEntry>
hier für die Gründe, die hier diskutiert. Wenn Sie pre-C# 4, und daher haben Sie nichtdynamic
Sie haben zu tun, die die enumeration manuell, als Gibsnag die Antwort nicht)field.GetValue()
gibt?Dictionary<string, string>
aber das ist nur, weil es mein Erster Testfall. Während der LaufzeitConsole.WriteLine(field.GetValue(this).GetType().Name);
druckt "Wörterbuch2". Edit: I just ran
Konsole.WriteLine(Feld.GetValue(this));` und bekamSystem.Collections.Generic.Dictionary'2[System.String, System.String]
bool
zuobject
- es wird bezeichnet als die Boxen, also die Technik wäre gültig.Prüfen, ob das umwandeln in und aus
object
wirklich notwendig ist. Ich begann auf diesem Weg, und stolperte über diesen Artikel, bevor Sie feststellen konnte ich erreichen, was ich brauchte, durch Generika anstatt der Konvertierung. Zum Beispiel;Dieses Stück code ist viel sauberer und schneller sein wird als die entsprechende conversion-code in anderen Antworten.
Ja, Es ist möglich zu werfen
FieldInfo
zuDictionary
wie untenDies ist nur ein Beispiel, ich habe in meinem code