Mam obiekt typu anonimowego, który otrzymuję jako dynamiczny z metody, którą chciałbym sprawdzić, czy właściwość istnieje w tym obiekcie.
....
var settings = new {
Filename="temp.txt",
Size=10
}
...
function void Settings(dynamic settings) {
var exists = IsSettingExist(settings,"Filename")
}
Jak zaimplementować IsSettingExist?
Odpowiedzi:
Wynik:
źródło
ViewBag
? Jeśli tak, zobacz stackoverflow.com/a/24192518/70345Is
przedrostka jest bardziej zagmatwany, niż byłoby to używane w inny sposóbHasProperty
. Powiedziałbym również, że używanie niepoprawnego gramatycznie przedrostka, takiego jak ten, nie jest w rzeczywistości idiomatyczne w C♯.źródło
objType.GetProperty(name) != null;
zwraca wartość null dla istniejących właściwościobjType.GetProperty(name) != null
zawsze zwróci abool
, które (z definicji) nigdy nie może byćnull
.Type.GetProperty(string)
dla nieistniejącej właściwości zwraca cokolwiek innego niż null.jeśli możesz kontrolować tworzenie / przekazywanie obiektu ustawień, polecam zamiast tego użycie ExpandoObject.
źródło
Działa to dla anonimowych typów
ExpandoObject
,Nancy.DynamicDictionary
czy cokolwiek innego, co może być oddanych doIDictionary<string, object>
.źródło
To działa dla mnie-:
źródło
RuntimeBinderException
, adynamicObj[property].Value
gdy wartość jest rzeczywiście istnieje ...var value = dynamicObj[property]
wystarczy ... a gdy go nie maKeyNotFoundException
naDictionary
to rzucony ... patrz niżej ...Żadne z powyższych rozwiązań pracował
dynamic
, która pochodzi odJson
, ja jednak udało się przekształcić jeden zTry catch
(przez @ user3359453) zmieniając typ wyjątku rzucony (KeyNotFoundException
zamiastRuntimeBinderException
) w coś, co faktycznie działa ...Mam nadzieję, że zaoszczędzi ci to trochę czasu.
źródło
Scalanie i naprawianie odpowiedzi od Serj-TM i user3359453, tak aby działało zarówno z ExpandoObject, jak i DynamicJsonObject. To działa dla mnie.
źródło
Używając refleksji, to jest funkcja, której używam:
następnie..
źródło
Where
najpierw wyrażenia lambda , a następnieAny
jest zbędne, ponieważ można również sformułować wyrażenie filtrujące w programieAny
.W przypadku, gdy ktoś musi obsłużyć obiekt dynamiczny pochodzący z Json, zmodyfikowałem odpowiedź Setha Reno, aby obsłużyć obiekt dynamiczny zdeserializowany z NewtonSoft.Json.JObjcet.
źródło
Aby przedłużyć odpowiedź z @Kuroro, jeśli chcesz sprawdzić, czy właściwość jest pusta, poniżej powinno działać.
źródło