我需要创建一个程序来导航对象结构并打印作为参数提供的任何“struct”的结构。
这些"结构"定义如下:
问题是当我试图打印数据成员时,这是一个类或结构。 我试图写一个递归函数来获取一个对象并检查对象中的每个字段:如果它是一个类,我再次将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中获取真实对象?
答案 0 :(得分:1)
对于IsClass
为真的字段,您希望将字段的值传递给嵌套调用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);
}
}
}
答案 1 :(得分:1)
执行此操作时:
if(memberType.IsClass)
{
getObj(member);
}
您以递归方式调用该方法,但您传回的方法是member
,即FieldInfo
。因此,您不必在字段值的字段中递归查看,而是查看System.Reflection.FieldInfo
的属性,我确定不是您想要的内容
也许你想要的是这个:
if(memberType.IsClass)
{
getObj(member.GetValue(i_obj));
}
现在你从字段中获取值 - 某种对象 - 然后以递归方式调用你的方法。
我不知道这是为了什么,但有可能在某些时候你需要考虑收藏。据推测,如果字段是一个字符串数组,您将要返回单个字符串。或者,如果它是某个对象的列表,您将要遍历列表中的项目,而不是List<T>
的成员。