Как я могу получить значение свойств во вложенных классах с помощью Reflection?

Я понимаю, что этот вопрос похож на некоторые другие, но на самом деле они не отвечают на то, что мне нужно. Я пытаюсь использовать Reflection, чтобы поместить большой класс «данных», в котором есть другие классы данных, и получить все эти значения, чтобы быстро создать JSON, чтобы каждый раз, когда добавляется новый фрагмент данных, не нужно было повторно кодировать что угодно.

Итак, в основном это будет выглядеть примерно так:

public class A
{
    public int data1 { set; get; }
    public B b { set; get; }
}
public class B
{
    public int data2 { set; get; }
}

//main method
{
    A a = new A();
    a.data1 = 1;
    a.b = new B();
    a.b.data2 = 2;

    PropertyInfo[] propInfos = typeof(A).GetProperties();
    foreach (PropertyInfo propInfo in propInfos)
    {
        // ??
        //if (!propInfo.GetType().IsPrimitive)
        //{
        //    PropertyInfo[] propInfosForB = propInfo.GetType().GetProperties();
        //    foreach (PropertyInfo propInfoForB in propInfos)
        //    {
        //        print(propInfoForB.GetValue(propInfo, null));
        //    }
        //}
        //else
        {               
            print(propInfo.GetValue(a, null));
        }
    }
}

Таким образом, в основном «1» печатается нормально, но я не могу понять, как получить «2» из B (как часть A). Все, что я получаю, - это множество напечатанных цифр «1» и «B» или ошибок. Надеюсь, это имеет смысл.

P.S: Я знаю, что сериализация была бы более простым решением, чтобы поместить все это в JSON, но я не могу использовать это по разным причинам.

РЕДАКТИРОВАТЬ: извините за дублирование. Комментарии и ответы помогли мне лучше понять, что я делаю и что ищу, так что спасибо!


person AlexTudo    schedule 19.08.2016    source источник
comment
Какие причины? Потому что на этом этапе вы пытаетесь написать сериализатор Json самостоятельно. Почему бы не использовать Json.NET? В конечном итоге вы напишете тот же код, только ваш будет медленнее и ошибочнее.   -  person Panagiotis Kanavos    schedule 19.08.2016
comment
Итак, вы в основном хотите распечатать полную структуру объекта?   -  person Icepickle    schedule 19.08.2016
comment
ваш второй оператор foreach снова перебирает свойства A. Это должно быть foreach (PropertyInfo propInfoForB в propInfosForB)   -  person Anil Goel    schedule 19.08.2016
comment
Я не особо в этом разбирался, но кажется, что вы хотите рекурсивно переходить к дочерним объектам, и есть много примеров того, как это сделать. Например: stackoverflow.com/a/20554262/1693085   -  person John Bustos    schedule 19.08.2016
comment
Джон Бустос, это то, что я искал! Большое спасибо, я должен был использовать слово рекурсивный в моем поиске. Я такой глупый. Панайотис Канавос, я боялся, что изобретаю велосипед. Честно говоря, коллега тщательно исследовал это и обнаружил различные проблемы с сериализацией этого и использованием его с PHP, а также многие типы из Unity, которые, похоже, не поддерживались этим (например, Quaternion, Color, Vector3 и т. Д.). Однако мы должны просмотрите эти причины и попробуйте сериализацию еще раз, потому что это довольно аккуратно. Спасибо всем за вашу помощь и извините за дублирование!   -  person AlexTudo    schedule 19.08.2016