Estou tentando implementar a transformação de dados usando o exemplo de reflexão 1 no meu código.
A GetSourceValue
função possui uma opção que compara vários tipos, mas quero remover esses tipos e propriedades e GetSourceValue
obter o valor da propriedade usando apenas uma única string como parâmetro. Eu quero passar uma classe e propriedade na string e resolver o valor da propriedade.
Isso é possível?
c#
reflection
properties
pedrofernandes
fonte
fonte
public static T GetPropertyValue<T>(object obj, string propName) { return (T)obj.GetType().GetProperty(propName).GetValue(obj, null); }
src.GetType().GetProperty(propName)?.GetValue(src, null);
";).GetProperty
e lançarPropertyNotFoundException
ou algo se nulo).Que tal algo como isso:
Isso permitirá que você desça para as propriedades usando uma única string, assim:
Você pode usar esses métodos como métodos estáticos ou extensões.
fonte
PropertyInfo.PropertyType
vez deobj.GetType()
em propriedades aninhadas, da mesma forma que acessaria a propriedade em uma propriedade aninhada.nameof
expressão a partir do C # 6 assim:nameof(TimeOfDay.Minutes)
no parâmetro name ao chamar a função para livrar as seqüências de caracteres mágicas e adicionar segurança de tempo de compilação a essas chamadas.Adicione a qualquer
Class
:Em seguida, você pode usar como:
fonte
SetValue
eGetValue
trabalham comObject
. Se você precisa trabalhar com um tipo específico, deve converter o resultadoGetValue
e atribuir o valor ao qual deseja atribuí-loSetValue
Que tal usar
CallByName
oMicrosoft.VisualBasic
namespace (Microsoft.VisualBasic.dll
)? Ele usa a reflexão para obter propriedades, campos e métodos de objetos normais, objetos COM e até objetos dinâmicos.e depois
fonte
Ótima resposta por jheddings. Gostaria de aperfeiçoá-lo, permitindo a referência de matrizes agregadas ou coleções de objetos, para que propertyName possa ser property1.property2 [X] .property3:
fonte
Se eu usar o código de Ed S. , recebo
Parece que
GetProperty()
não está disponível no Xamarin.Forms.TargetFrameworkProfile
éProfile7
na minha Biblioteca de Classes Portátil (.NET Framework 4.5, Windows 8, ASP.NET Core 1.0, Xamarin.Android, Xamarin.iOS, Xamarin.iOS Classic).Agora eu encontrei uma solução de trabalho:
Fonte
fonte
Sobre a discussão de propriedades aninhadas, você pode evitar todo o material de reflexão se usar o
DataBinder.Eval Method (Object, String)
seguinte:Obviamente, você precisará adicionar uma referência à
System.Web
montagem, mas isso provavelmente não é grande coisa.fonte
O método para chamar foi alterado no .NET Standard (a partir da versão 1.6). Também podemos usar o operador condicional nulo do C # 6.
fonte
? operator
Usando PropertyInfo do espaço para nome System.Reflection . A reflexão compila muito bem, não importa a propriedade que tentamos acessar. O erro será exibido durante o tempo de execução.
Funciona bem para obter a propriedade Location de um objeto
Obteremos o local: {X = 71, Y = 27} Também podemos retornar location.X ou location.Y da mesma maneira.
fonte
Essa é uma maneira de obter todas as propriedades com seus valores em uma Lista.
fonte
type.GetProperty(pi.Name)
quando isso é == para a variávelpi
?if
e nãoselfValue?.ToString()
Caso contrário, se livrar deif
e usoselfValue==null?null:selfValue.ToString()
List<KeyValuePair<
é ímpar, use um dicionárioDictionary<string, string>
O código a seguir é um método recursivo para exibir toda a hierarquia de todos os nomes e valores de propriedades contidos na instância de um objeto. Este método usa uma versão simplificada da
GetPropertyValue()
resposta de AlexD acima neste tópico. Graças a esta discussão, consegui descobrir como fazer isso!Por exemplo, eu uso esse método para mostrar uma explosão ou despejo de todas as propriedades em uma
WebService
resposta chamando o método da seguinte maneira:fonte
fonte
fonte
O método abaixo funciona perfeito para mim:
Para obter o valor da propriedade:
Para definir o valor da propriedade:
fonte
fonte
Aqui está outra maneira de encontrar uma propriedade aninhada que não exija que a cadeia indique o caminho de aninhamento. Crédito para Ed S. pelo método da propriedade única.
fonte
Type.GetProperty
retorna emnull
vez de chamarGetValue
e ter sidoNullReferenceException
lançado em um loop.Você nunca menciona qual objeto está inspecionando e, como está rejeitando aqueles que fazem referência a um determinado objeto, assumirei que você quer dizer um estático.
Observe que marquei o objeto que está sendo inspecionado com a variável local
obj
.null
significa estático; caso contrário, configure-o como desejar. Observe também que esseGetEntryAssembly()
é um dos poucos métodos disponíveis para obter a montagem "em execução"; convém brincar com ela se estiver com dificuldades para carregar o tipo.fonte
Dê uma olhada na biblioteca Heleonix.Reflection . Você pode obter / definir / chamar membros por caminhos ou criar um getter / setter (lambda compilado em um delegado) que seja mais rápido que a reflexão. Por exemplo:
Ou crie um getter uma vez e faça cache para reutilização (isso é mais eficiente, mas pode gerar NullReferenceException se um membro intermediário for nulo):
Ou, se você deseja criar
List<Action<object, object>>
diferentes getters, especifique os tipos de base para os delegados compilados (as conversões de tipo serão adicionadas às lambdas compiladas):fonte
caminho mais curto ....
fonte
jheddings e AlexD escreveram excelentes respostas sobre como resolver sequências de propriedades. Eu gostaria de colocar a minha na mistura, já que escrevi uma biblioteca dedicada exatamente para esse fim.
A classe principal de Pather.CSharp é
Resolver
. Por padrão, ele pode resolver propriedades, entradas de matriz e dicionário.Então, por exemplo, se você tiver um objeto como este
e deseja obter
Property2
, você pode fazer assim:Este é o exemplo mais básico dos caminhos que ele pode resolver. Se você quiser ver o que mais ele pode ou como pode estendê-lo, vá para a página do Github .
fonte
Aqui está a minha solução. Também funciona com objetos COM e permite acessar itens de coleção / matriz de objetos COM.
fonte
Aqui está o que eu recebi com base em outras respostas. Um pouco de exagero ao ser tão específico com o tratamento de erros.
fonte