Ich habe ein anonymes Typobjekt, das ich als Dynamik von einer Methode erhalte, die ich überprüfen möchte, ob eine Eigenschaft für dieses Objekt vorhanden ist.
....
var settings = new {
Filename="temp.txt",
Size=10
}
...
function void Settings(dynamic settings) {
var exists = IsSettingExist(settings,"Filename")
}
Wie würde ich IsSettingExist implementieren?
Antworten:
Ausgabe:
quelle
ViewBag
? Wenn ja, siehe stackoverflow.com/a/24192518/70345Is
Präfixes verwirrender, als es sonst zu verwenden wäreHasProperty
. Ich würde auch sagen, dass die Verwendung eines solchen grammatikalisch falschen Präfixes in C♯ eigentlich nicht idiomatisch ist.quelle
objType.GetProperty(name) != null;
gibt null für Eigenschaften zurück, die existierenobjType.GetProperty(name) != null
wird immer ein zurückgebenbool
, was (per Definition) niemals sein kannnull
.Type.GetProperty(string)
für eine nicht vorhandene Eigenschaft leben, und geben etwas anderes als null zurück.Wenn Sie das Erstellen / Übergeben des Einstellungsobjekts steuern können, würde ich empfehlen, stattdessen ein ExpandoObject zu verwenden.
quelle
Dies funktioniert für anonyme Typen,
ExpandoObject
,Nancy.DynamicDictionary
oder irgendetwas anderes, das gegossen werden kannIDictionary<string, object>
.quelle
Das funktioniert bei mir-:
quelle
RuntimeBinderException
unddynamicObj[property].Value
wenn der Wert tatsächlich gibt es ...var value = dynamicObj[property]
ist genug ... und wenn es nicht vorhanden istKeyNotFoundException
aufDictionary
geworfen wird ... siehe unten ...Keine der oben genannten Lösungen gearbeitet ,
dynamic
dass kommt vonJson
, ich aber eines mit zu transformieren verwaltetTry catch
(von @ user3359453) durch Ausnahmetyp (geworfen WechselKeyNotFoundException
stattRuntimeBinderException
) in etwas , das tatsächlich funktioniert ...Hoffe das spart dir etwas Zeit.
quelle
Zusammenführen und Korrigieren von Antworten von Serj-TM und user3359453, sodass es sowohl mit ExpandoObject als auch mit DynamicJsonObject funktioniert. Das funktioniert bei mir.
quelle
Mit Reflektion ist dies die Funktion, die ich benutze:
dann..
quelle
Where
und dannAny
ist er redundant, da Sie auch Ihren Filterausdruck in formulieren könnenAny
.Für den Fall, dass jemand ein dynamisches Objekt von Json verarbeiten muss, habe ich die Antwort von Seth Reno geändert, um dynamische Objekte zu verarbeiten, die von NewtonSoft.Json.JObjcet deserialisiert wurden.
quelle
Um die Antwort von @Kuroro zu erweitern, sollte unten funktionieren, wenn Sie testen müssen, ob die Eigenschaft leer ist.
quelle