Как преобразовать fieldinfo в фактический объект класса? используя C#

Мне нужно создать программу для навигации по объектной структуре и распечатать структуру любой "структуры", представленной в качестве аргумента.

Эти "структуры" определены следующим образом:

  • Они имеют только публичные атрибуты
  • Каждый атрибут может быть следующих типов:
    • "Структура"
    • Примитив (например, int), примитивная оболочка (например, Integer) или String

проблема в том, когда я пытаюсь напечатать элемент данных, который является классом или структурой. я пытаюсь написать рекурсивную функцию, которая получает объект и проверяет каждое поле в объекте: если это класс, я отправляю снова поле curr той же функции. иначе я печатаю значение поля.

это мой код но когда я отправляю fieldInfo функции, строка кода: ---> Type objType = i_obj.GetType();

получает мне следующее значение: object.GetType возвращенный {Name = "RtFieldInfo" FullName = System.Reflection.RtFieldInfo"} System.RuntimeType

    public static void getObj(object i_obj)
    {
        Type objType = i_obj.GetType();

        FieldInfo[] objField = objType.GetFields();

        foreach (FieldInfo member in objField)
        {
            Type memberType = member.FieldType;

            if(memberType.IsClass)
            {                    
                getObj(member);
            }

            else
            {
                Console.WriteLine(member.Name + " : " + member.GetValue(i_obj));
            }

        }
    }

Как я могу получить реальный объект из fieldInfo?

2 ответа

Решение

Для полей, где IsClass Значение true, вы хотите передать значение поля вложенному вызову getObj, Также вы можете сделать некоторые null проверки:

public static void getObj(object i_obj)
{
    Type objType = i_obj.GetType();

    FieldInfo[] objField = objType.GetFields();

    foreach (FieldInfo member in objField)
    {
        Type memberType = member.FieldType;

        object memberValue = member.GetValue(i_obj); // <---

        if (memberValue == null)
        {
            Console.WriteLine(member.Name + " : null");
        }
        else if(memberType.IsClass)
        {                    
            getObj(memberValue); // <---
        }
        else
        {
            Console.WriteLine(member.Name + " : " + memberValue);
        }

    }
}

Когда вы делаете это:

if(memberType.IsClass)
{                    
    getObj(member);
}

Вы вызываете метод рекурсивно, но вы возвращаетесь в него member, который является FieldInfo, Таким образом, вместо того, чтобы рекурсивно смотреть на поля значения поля, вы будете смотреть на свойства System.Reflection.FieldInfo что я уверен, не то, что вы хотите.

Возможно, что вы хотите, это:

if(memberType.IsClass)
{                    
    getObj(member.GetValue(i_obj));
}

Теперь вы получаете значение из поля - какой-то объект - и рекурсивно вызываете ваш метод с этим.

Я не знаю, для чего это нужно, но есть вероятность, что в какой-то момент вам придется учитывать коллекции. Предположительно, если поле представляет собой массив строк, вы захотите вернуть отдельные строки. Или, если это список какого-то объекта, вам нужно будет перебирать элементы в списке, а не члены List<T>,

Другие вопросы по тегам