Kann ein ExpandoObject eine Liste sein?
-
21-12-2019 - |
Frage
Ich verwende Json.Net, um JSON-Ergebnisse zu deserialisieren ExpandoObjects
Verwenden von Code wie dem folgenden:
var converter = new ExpandoObjectConverter();
dynamic d = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);
Dies funktioniert hervorragend für alles außer Antworten, die nur eine Liste im Stammverzeichnis des JSON-Schemas haben, wie zum Beispiel diese:
string json = @"[{""title"": ""the title""}]";
Im Darm von JsonConvert
ist diese Methode:
public static T DeserializeObject<T>(string value, params JsonConverter[] converters)
{
return (T)DeserializeObject(value, typeof(T), converters);
}
Der Rückgabewert DeserializeObject
ist ein richtig konstruiertes List<object>
mit auf ExpandoObject
darin, aber der Code schlägt fehl, wenn er versucht, diese Liste in ein ExpandoObject selbst (den Wert von T) umzuwandeln.
Ich habe einen fehlgeschlagenen Komponententest und könnte das beheben, bin mir aber nicht sicher, wie ich einen ausfüllen soll List
direkt in eine ExpandoObject
.
Ist das möglich? DynamicObject
hat TryGetIndex
also gehe ich von einem aus ExpandoObject
kann einen Indexer haben.Wäre es notwendig, sorgfältig eine listenartige Instanz von Expando zu erstellen, indem die Implementierung einer Indexierungsmethode dynamisch bereitgestellt wird, oder auf andere Weise eine Nicht-Expando-Instanz zu erstellen? DynamicObject
die Liste halten und die korrekten Methoden aus dynamischen Methodenaufrufen aufrufen?
Lösung
DynamicObject verfügt über TryGetIndex, daher gehe ich davon aus, dass ein ExpandoObject einen Indexer haben kann
Nein, das geht nicht.Probieren Sie es einfach aus, es gibt ein RuntimeBinderException
:
Die Indizierung mit [] kann nicht auf einen Ausdruck vom Typ „System.Dynamic.ExpandoObject“ angewendet werden.
Ein ExpandoObject
ist keine Liste;es ist eher wie ein Wörterbuch.
Wäre es notwendig, sorgfältig eine listenartige Instanz von expando zu erstellen, indem die Implementierung einer Indexierungsmethode dynamisch bereitgestellt wird, oder auf andere Weise ein nicht expandiertes dynamisches Objekt zu erstellen, um die Liste zu speichern und die korrekten Methoden aus dynamischen Methodenaufrufen aufzurufen?
Nun, Sie könnten eine benutzerdefinierte erstellen DynamicObject
das verhält sich wie eine Liste, aber ich sehe darin keinen Nutzen:Sie können genauso gut eine normale Liste verwenden.