Eu tenho uma classe que contém várias propriedades (todas são strings, se isso fizer alguma diferença).
Também tenho uma lista que contém muitas instâncias diferentes da classe.
Ao criar alguns testes de unidade para minhas classes, decidi que queria fazer um loop em cada objeto da lista e, em seguida, em cada propriedade desse objeto ...
Achei que fazer isso seria tão simples quanto ...
foreach (Object obj in theList)
{
foreach (Property theProperties in obj)
{
do some stufff!!;
}
}
Mas isso não funcionou! :( Recebo este erro ...
"A instrução foreach não pode operar em variáveis do tipo 'Application.Object' porque 'Application.Object' não contém uma definição pública para 'GetEnumerator'"
Alguém conhece uma maneira de fazer isso sem toneladas de ifs e loops ou sem entrar em nada muito complexo?
c#
properties
foreach
generic-list
Jammerz858
fonte
fonte
Respostas:
Experimente:
Observe também que
Type.GetProperties()
tem uma sobrecarga que aceita um conjunto de sinalizadores de ligação para que você possa filtrar propriedades em um critério diferente, como nível de acessibilidade, consulte MSDN para obter mais detalhes: Método Type.GetProperties (BindingFlags) Por último, mas não menos importante, não se esqueça de adicione a referência de montagem "system.Reflection".Por exemplo, para resolver todas as propriedades públicas:
Informe se isso funciona conforme o esperado.
fonte
Você pode percorrer todas as propriedades não indexadas de um objeto como este:
Uma vez que
GetProperties()
retorna indexadores , bem como propriedades simples, você precisa de um filtro adicional antes de chamarGetValue
para saber se é seguro passarnull
como o segundo parâmetro.Pode ser necessário modificar ainda mais o filtro para eliminar propriedades somente gravação e outras inacessíveis.
fonte
null
getter, mas tenho certeza que o OP descobrirá como obter apenas as propriedades de que precisa.Você está quase lá, você só precisa obter as propriedades do tipo, em vez de esperar que as propriedades estejam acessíveis na forma de uma coleção ou bolsa de propriedades:
De lá, você pode acessar da seguinte forma :
Com
GetValue
o segundo parâmetro permitirá que você especifique valores de índice, que funcionarão com propriedades que retornam coleções - uma vez que uma string é uma coleção de caracteres, você também pode especificar um índice para retornar um caractere se necessário.fonte
Claro, sem problema:
fonte
if (item == null) continue;
Pessoalmente, acho que se você obtiver um objeto nulo nesse ponto, algo deu errado muito antes e é aí que a validação deveria estar, ou estou errado?Use o Reflection para fazer isso
fonte
Procurei a resposta para uma pergunta semelhante nesta página, escrevi as respostas para várias perguntas semelhantes que podem ajudar as pessoas que entram nesta página.
Lista de classes
A classe List <T> representa a lista de objetos que podem ser acessados por índice. Ele vem com o namespace System.Collection.Generic. A classe de lista pode ser usada para criar uma coleção de diferentes tipos, como inteiros, strings, etc. A classe de lista também fornece os métodos para pesquisar, classificar e manipular listas.
Classe com propriedade :
OU, Classe com campo :
OU, Lista de objetos (sem as mesmas células):
OU, Lista de objetos (deve ter as mesmas células):
OU, Lista de objetos (com chave):
OU, lista de dicionário
Boa sorte..
fonte
Uma pequena palavra de cautela, se "fazer alguma coisa" significa atualizar o valor da propriedade real que você visita E se houver uma propriedade do tipo de estrutura ao longo do caminho do objeto raiz para a propriedade visitada, a alteração que você fez na propriedade não ser refletido no objeto raiz.
fonte
Não consegui fazer com que nenhuma das formas acima funcionasse, mas funcionou. O nome de usuário e a senha para DirectoryEntry são opcionais.
fonte
Uma solução de copiar e colar (métodos de extensão) principalmente com base em respostas anteriores a esta pergunta.
Também lida corretamente com IDicitonary (ExpandoObject / dynamic), que geralmente é necessário ao lidar com essas coisas refletidas.
Não recomendado para uso em loops apertados e outros caminhos quentes. Nesses casos, você precisará de alguma compilação de cache / emissão de IL / árvore de expressão.
fonte