Как преобразовать 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>
,