No mundo do PHP, decidi tentar o C #. Eu fiz uma pesquisa, mas não consigo encontrar a resposta de como fazer o equivalente a isso.
$object = new Object();
$vars = get_class_vars(get_class($object));
foreach($vars as $var)
{
doSomething($object->$var);
}
Basicamente, tenho uma lista de um objeto. O objeto pode ser um dos três tipos diferentes e terá um conjunto de propriedades públicas. Quero poder obter uma lista das propriedades do objeto, fazer um loop sobre elas e depois gravá-las em um arquivo. Eu estou pensando que isso tem algo a ver com a reflexão c #, mas é tudo novo para mim.
Qualquer ajuda seria muito apreciada.
c#
reflection
m4rc
fonte
fonte
Respostas:
Isso deve servir:
fonte
System.Reflection
namespacePropertyInfo[] props = input.GetType().GetProperties();
Newtonsoft.Json.JsonConvert
?fonte
Sim, a reflexão seria o caminho a percorrer. Primeiro, você obteria o
Type
que representa o tipo (em tempo de execução) da instância na lista. Você pode fazer isso chamando oGetType
método emObject
. Por estar naObject
classe, é possível chamar todos os objetos no .NET, pois todos os tipos derivamObject
( bem, tecnicamente, nem tudo , mas isso não é importante aqui).Depois de ter a
Type
instância, você pode chamar oGetProperties
método para obter asPropertyInfo
instâncias que representam as informações em tempo de execução sobre as propriedades noType
.Observe que você pode usar as sobrecargas de
GetProperties
para ajudar a classificar quais propriedades você recupera.A partir daí, basta escrever as informações em um arquivo.
Seu código acima, traduzido, seria:
Observe que, se você quiser informações sobre o método ou informações sobre o campo, precisará chamar uma das sobrecargas dos métodos
GetMethods
ouGetFields
, respectivamente.Observe também que uma coisa é listar os membros em um arquivo, mas você não deve usar essas informações para conduzir a lógica com base nos conjuntos de propriedades.
Supondo que você tenha controle sobre as implementações dos tipos, você deve derivar de uma classe base comum ou implementar uma interface comum e fazer as chamadas (você pode usar o operador
as
oris
para ajudar a determinar com qual classe / interface base você está trabalhando. tempo de execução).No entanto, se você não controla essas definições de tipo e precisa conduzir a lógica com base na correspondência de padrões, tudo bem.
fonte
bem, em C # é semelhante. Aqui está um dos exemplos mais simples (apenas para propriedades públicas):
fonte
Para obter um valor específico da propriedade do nome da propriedade
para acessar o valor da propriedade Name a partir da string name of property
fonte
Você pode usar GetType - GetProperties - Linq Foreach :
fonte
Solução de uma linha usando Linq ...
fonte
Aqui está algo que eu uso para transformar um
IEnumerable<T>
em umDataTable
que contém colunas representandoT
as propriedades de, com uma linha para cada item noIEnumerable
:Isso é "um pouco" complicado demais, mas é realmente muito bom ver qual é o resultado, como você pode dar um
List<T>
exemplo, por exemplo:E você receberá uma DataTable com a estrutura:
Com uma linha por item no seu
List<Car>
fonte
Este exemplo apara todas as propriedades de sequência de um objeto.
fonte
Não encontrei isso para trabalhar, digamos, Objetos de aplicativo. No entanto, tive sucesso com
fonte
fonte
fonte
Você pode tentar isso:
Uma vez que cada array implementa a interface IEnumerable
fonte