Wenn der IDynamicMetaObjectProvider die dynamischen Mitgliedsnamen bereitstellen kann, können Sie sie abrufen. Siehe GetMemberNames- Implementierung in der Apache-lizenzierten PCL-Bibliothek Dynamitey (die in Nuget zu finden ist). Sie funktioniert für ExpandoObject
s und DynamicObject
s, die implementiert werden, GetDynamicMemberNames
und für alle anderen IDynamicMetaObjectProvider
, die ein Metaobjekt mit einer Implementierung GetDynamicMemberNames
ohne benutzerdefinierte Tests bereitstellen is IDynamicMetaObjectProvider
.
Nachdem Sie die Mitgliedsnamen erhalten haben, ist es etwas aufwendiger, den Wert richtig zu ermitteln, aber Impromptu tut dies, aber es ist schwieriger, nur auf die interessanten Punkte hinzuweisen und sie sinnvoll zu machen. Hier ist die Dokumentation , die gleich oder schneller als die Reflexion ist. Es ist jedoch unwahrscheinlich, dass sie schneller als eine Wörterbuchsuche für expando ist. Sie funktioniert jedoch für jedes Objekt, expando, dynamisch oder original - wie Sie es nennen.
Im Fall von ExpandoObject implementiert die ExpandoObject-Klasse tatsächlich
IDictionary<string, object>
ihre Eigenschaften, sodass die Lösung so trivial ist wie das Casting:Beachten Sie, dass dies für allgemeine dynamische Objekte nicht funktioniert. In diesen Fällen müssen Sie über IDynamicMetaObjectProvider zum DLR wechseln.
quelle
Es sind mehrere Szenarien zu berücksichtigen. Zunächst müssen Sie den Typ Ihres Objekts überprüfen. Sie können dazu einfach GetType () aufrufen. Wenn der Typ IDynamicMetaObjectProvider nicht implementiert, können Sie die Reflektion wie für jedes andere Objekt verwenden. Etwas wie:
Bei IDynamicMetaObjectProvider-Implementierungen funktioniert die einfache Reflexion jedoch nicht. Grundsätzlich müssen Sie mehr über dieses Objekt wissen. Wenn es sich um ExpandoObject handelt (eine der IDynamicMetaObjectProvider-Implementierungen), können Sie die von itowlson bereitgestellte Antwort verwenden. ExpandoObject speichert seine Eigenschaften in einem Wörterbuch und Sie können Ihr dynamisches Objekt einfach in ein Wörterbuch umwandeln.
Wenn es sich um DynamicObject handelt (eine weitere IDynamicMetaObjectProvider-Implementierung), müssen Sie die von DynamicObject bereitgestellten Methoden verwenden. DynamicObject ist nicht erforderlich, um die Liste der Eigenschaften irgendwo zu "speichern". Zum Beispiel könnte es so etwas tun (ich verwende ein Beispiel aus meinem Blog-Beitrag wieder ):
In diesem Fall gibt das Objekt bei jedem Versuch, auf eine Eigenschaft (mit einem bestimmten Namen) zuzugreifen, einfach den Namen der Eigenschaft als Zeichenfolge zurück.
Sie müssen also nicht über etwas nachdenken - dieses Objekt hat keine Eigenschaften, und gleichzeitig funktionieren alle gültigen Eigenschaftsnamen.
Ich würde sagen, dass Sie für IDynamicMetaObjectProvider-Implementierungen nach bekannten Implementierungen filtern müssen, in denen Sie eine Liste von Eigenschaften wie ExpandoObject abrufen und den Rest ignorieren (oder eine Ausnahme auslösen) können.
quelle
Benötigt Newtonsoft Json.Net
Ein bisschen spät, aber ich habe mir das ausgedacht. Es gibt Ihnen nur die Tasten und dann können Sie diese für die Dynamik verwenden:
Dann suchen Sie einfach so:
Wählen Sie, ob Sie den Wert als Zeichenfolge oder als anderes Objekt abrufen oder eine andere Dynamik ausführen und die Suche erneut verwenden möchten.
quelle
JObject attributesAsJObject = dynamicToGetPropertiesFor;
etwas ersetzen wie :var jObject = (JObject) JToken.FromObject(dynamicToGetPropertiesFor);
. Zu diesem Zeitpunkt können Sie ein Wörterbuch mit Eigenschaftsnamen und -werten abrufen, indem Sie Folgendes tunvar objProperties = jObject.ToObject<Dictionary<string, object>>();
. Damit sind Sie auf dem Weg zu den Rennen. Dies erfordert keine Dynamik. Es funktioniert gut mit allem, was eine Unterklasse vonDynamicObject