Eu tenho um objeto do tipo anônimo que recebo como uma dinâmica de um método que gostaria de verificar se existe uma propriedade nesse objeto.
....
var settings = new {
Filename="temp.txt",
Size=10
}
...
function void Settings(dynamic settings) {
var exists = IsSettingExist(settings,"Filename")
}
Como eu implementaria IsSettingExist?
Respostas:
Resultado:
fonte
ViewBag
? Em caso afirmativo, consulte stackoverflow.com/a/24192518/70345Is
prefixo é mais confuso do que seria de outra formaHasProperty
. Eu também diria que usar um prefixo gramaticalmente incorreto como esse não é idiomático em C♯.fonte
objType.GetProperty(name) != null;
retorna nulo em propriedades que existemobjType.GetProperty(name) != null
sempre retornará umbool
, o que (por definição) nunca pode sernull
.Type.GetProperty(string)
para uma propriedade inexistente retorna qualquer coisa diferente de nulo.se você pode controlar a criação / passagem do objeto de configurações, eu recomendo usar um ExpandoObject.
fonte
Isso funciona para tipos anônimos
ExpandoObject
,Nancy.DynamicDictionary
ou qualquer outra coisa que possa ser lançadaIDictionary<string, object>
.fonte
Isso está funcionando para mim-:
fonte
RuntimeBinderException
edynamicObj[property].Value
quando o valor está realmente lá ...var value = dynamicObj[property]
é o suficiente ... e quando ela não existeKeyNotFoundException
emDictionary
é jogado ... veja abaixo ...Nenhuma das soluções acima funcionou para
dynamic
isso vemJson
, no entanto, consegui transformar um comTry catch
(por @ user3359453), alterando o tipo de exceção lançada (emKeyNotFoundException
vez deRuntimeBinderException
) em algo que realmente funciona ...Espero que isso economize algum tempo.
fonte
Mesclando e corrigindo respostas de Serj-TM e user3359453 para que funcione com ExpandoObject e DynamicJsonObject. Isso funciona para mim.
fonte
Usando reflexão, esta é a função que uso:
então..
fonte
Where
primeiro e depoisAny
é redundante, pois você também pode formular sua expressão de filtragemAny
.No caso de alguém precisar lidar com um objeto dinâmico vindo de Json, modifiquei a resposta de Seth Reno para lidar com objeto dinâmico desserializado de NewtonSoft.Json.JObjcet.
fonte
Para estender a resposta de @Kuroro, se você precisa testar se a propriedade está vazia, abaixo deve funcionar.
fonte