Se o IDynamicMetaObjectProvider puder fornecer os nomes de membros dinâmicos, você poderá obtê-los. Veja a implementação de GetMemberNames na biblioteca PCL licenciada do apache Dynamitey (que pode ser encontrada em nuget), ela funciona para ExpandoObject
s e DynamicObject
s que implementam GetDynamicMemberNames
e para qualquer outro IDynamicMetaObjectProvider
que fornece um metaobjeto com uma implementação GetDynamicMemberNames
sem testes personalizados além is IDynamicMetaObjectProvider
.
Depois de obter os nomes dos membros, é um pouco mais trabalhoso obter o valor da maneira certa, mas o Impromptu faz isso, mas é mais difícil apontar apenas os bits interessantes e fazer com que faça sentido. Aqui está a documentação e é igual ou mais rápida que a reflexão; no entanto, é improvável que seja mais rápida que uma pesquisa no dicionário para expando, mas funciona para qualquer objeto, expando, dinâmico ou original - você escolhe.
No caso de ExpandoObject, a classe ExpandoObject realmente implementa
IDictionary<string, object>
suas propriedades, portanto a solução é tão trivial quanto a conversão:Observe que isso não funcionará para objetos dinâmicos gerais. Nesses casos, você precisará ir para o DLR via IDynamicMetaObjectProvider.
fonte
Existem vários cenários a serem considerados. Primeiro de tudo, você precisa verificar o tipo do seu objeto. Você pode simplesmente chamar GetType () para isso. Se o tipo não implementar IDynamicMetaObjectProvider, você poderá usar a mesma reflexão de qualquer outro objeto. Algo como:
No entanto, para implementações IDynamicMetaObjectProvider, a reflexão simples não funciona. Basicamente, você precisa saber mais sobre esse objeto. Se for ExpandoObject (que é uma das implementações IDynamicMetaObjectProvider), você poderá usar a resposta fornecida por itowlson. ExpandoObject armazena suas propriedades em um dicionário e você pode simplesmente converter seu objeto dinâmico em um dicionário.
Se for DynamicObject (outra implementação de IDynamicMetaObjectProvider), será necessário usar quaisquer métodos que este DynamicObject exponha. O DynamicObject não é necessário para "armazenar" realmente sua lista de propriedades em qualquer lugar. Por exemplo, pode ser algo como isto (estou reutilizando um exemplo da minha postagem no blog ):
Nesse caso, sempre que você tentar acessar uma propriedade (com qualquer nome), o objeto simplesmente retornará o nome da propriedade como uma sequência.
Portanto, você não tem nada para refletir - esse objeto não possui propriedades e, ao mesmo tempo, todos os nomes de propriedades válidos funcionarão.
Eu diria que para implementações IDynamicMetaObjectProvider, você precisa filtrar implementações conhecidas, onde pode obter uma lista de propriedades, como ExpandoObject, e ignorar (ou lançar uma exceção) para o resto.
fonte
Requer Newtonsoft Json.Net
Um pouco tarde, mas eu vim com isso. Ele fornece apenas as chaves e você pode usá-las na dinâmica:
Então você simplesmente projeta assim:
Optando por obter o valor como uma sequência ou outro objeto, ou faça outra dinâmica e use a pesquisa novamente.
fonte
JObject attributesAsJObject = dynamicToGetPropertiesFor;
com algo como:var jObject = (JObject) JToken.FromObject(dynamicToGetPropertiesFor);
. Nesse ponto, você pode obter um dicionário de nomes e valores de propriedades fazendo algo parecidovar objProperties = jObject.ToObject<Dictionary<string, object>>();
. Com isso em mãos, você está pronto para as corridas. Isso não precisa de uma dinâmica. Ele funciona bem com qualquer coisa que é uma subclasse deDynamicObject