Odczyt wartości wszystkich właściwości w drzewie obiektów

0

Witam,
mam zdefiniowaną taka strukturę danych:

public class Samochod
{
public string Opis1 { get; set; }
public string Opis2 { get; set; }
public string Wnetrze{ get; set; }
public string Karoseria{ get; set; }
}

public class Karoseria
{
public string Kolor { get; set; }
public string Grubosc { get; set; }
}

public class Wnetrze
{
public string COpis1 { get; set; }
public string COpis2 { get; set; }
public string Siedzenia { get; set; }
}

public class Siedzenia
{
public int Ilosc { get; set; }
public string Material{ get; set; }
}

Czy mogę / jak mógłbym w pętli odczytać wartości wszystkich właściwości w takim drzewie obiektów?

2

Najłatwiej to przejechać rekurencyjnie refleksją po właściwościach tego obiektu i

  1. wypisać ich wartości jeśli nie są klasami
  2. przekazać do funkcji wypisującej obiekt do którego odwołuje się właściwość jeżeli jest klasą
1

Naskrobałem na szybko coś takiego, ale pewnie da się to jeszcze ulepszyć:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace CSharpConsoleApp
{
    class First
    {
        public string FirstName { get; set; }
        public int Age { get; set; }
    }

    class Second
    {
        public string SecondName { get; set; }
        public First FirstObject { get; set; }
    }

    class Program
    {
        static void ReadProperties(object obj, string prefix = " ")
        {
            foreach (var prop in obj.GetType().GetProperties())
            {
                if (prop.GetIndexParameters().Length == 0)
                {
                    Console.WriteLine(prefix + prop.Name + ": " + prop.GetValue(obj, null));
                    if (!prop.PropertyType.IsPrimitive)
                    {
                        ReadProperties(prop.GetValue(obj, null), prefix + " ");
                    }
                }
            }
        }

        static void Main(string[] args)
        {
            var sec = new Second
            {
                SecondName = "SecondName",
                FirstObject = new First { FirstName = "FirstName", Age = 12 }
            };

            ReadProperties(sec);
        }
    }
}

https://ideone.com/SiIRmd

1 użytkowników online, w tym zalogowanych: 0, gości: 1