none
Reflection em classes RRS feed

  • Pergunta

  • Olá, preciso percorrer uma classe e buscar as propriedades dela, mas não estou conseguindo retornar todas. Veja um exemplo, supondo as classes abaixo.

    public class Cidade
    {
       public int Id { get; set; }
       public string Nome { get; set; }
    }

    public class Aluno
    {
       public int Id { get; set; }
       public string Nome { get; set; }
       public Cidade Cidade { get; set; }
    }

    public class Avaliacao
    {
       public int Id { get; set; }
       public Aluno Aluno { get; set; }
    }

    Preciso listar todas as propriedades da classe Avaliacao e quando chegar em uma propriedade que também é uma classe deve ser listada as suas. Resumindo:

    Avaliacao->Id

    Avaliacao->Aluno

    Avaliacao->Aluno->Id

    Avaliacao->Aluno->Nome

    Avaliacao->Aluno->Cidade

    Avaliacao->Aluno->Cidade->Id

    Avaliacao->Aluno->Cidade->Nome

    Somente consigo listar as do primeiro nível.

    Type tipo = obj.GetType();
    PropertyInfo[] propriedades = tipo.GetProperties();
    foreach (var item in propriedades)
    {
       lista.Add(item.Name);

       Type pTipo = item.PropertyType;
       PropertyInfo[] props = pTipo.GetProperties(); // aqui não retorna as propriedades quando é uma classe, por ex. Id e Nome do aluno
    ...
    }


    sexta-feira, 26 de junho de 2015 12:51

Respostas

  • Olá Ibzzi, o exemplo abaixo usa Atributos para identificar as classes na qual você quer escrever os nomes:

    public class Cidade
        {
            public int Id { get; set; }
            public string Nome { get; set; }
        }
    
        public class Aluno
        {
            public int Id { get; set; }
            public string Nome { get; set; }
    
            [AtributoClasse]
            public Cidade Cidade { get; set; }
        }
    
        public class Avaliacao
        {
            public int Id { get; set; }
    
            [AtributoClasse]
            public Aluno Aluno { get; set; }
        }
    
        public class Pessoa
        {
            public string Nome { get; set; }
    
            public int Idade { get; set; }
        }
    
        public class AtributoClasse : Attribute
        {
    
        }

    Depois de definir os atributos nas propriedades que são classes, você pode fazer um pequeno método recursivo para escrever o nome das propriedades.

    var avaliacao = new Avaliacao();

    this.EscreverTodasAsPropriedades(avaliacao.GetType());


    private void EscreverTodasAsPropriedades(Type tipo)
            {
                Console.WriteLine("Propriedades do tipo: " + tipo.Name);
    
                foreach (var propriedade in tipo.GetProperties())
                {
                    Console.WriteLine(propriedade.Name);
    
                    if(propriedade.GetCustomAttributes(typeof(AtributoClasse), false).Length != 0)
                        EscreverTodasAsPropriedades(propriedade.PropertyType);
                }
            }


    sexta-feira, 26 de junho de 2015 14:54