如何将 fieldinfo 转换为实际的 class 对象?使用 C#
How to convert fieldinfo to it's actual class object? using C#
我需要创建程序来导航对象结构并打印作为参数提供的任何“结构”的结构。
这些"structs"定义如下:
- 它们只有 public 个属性
- 每个属性可以是以下类型:
- “结构”
- 原始类型(例如 int)、原始包装器(例如 Integer)或 String
问题是当我试图打印 class 或结构的数据成员时。
我正在尝试编写一个递归函数来获取一个对象并检查对象中的每个字段:如果它是 class 它们,我再次将 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 中获取真实对象??
对于 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);
}
}
}
当你这样做时:
if(memberType.IsClass)
{
getObj(member);
}
您正在递归调用该方法,但您传回给它的是 member
,这是一个 FieldInfo
。因此,不是递归地查看字段值的字段,而是查看 System.Reflection.FieldInfo
的属性,我确定这不是您想要的。
也许你想要的是:
if(memberType.IsClass)
{
getObj(member.GetValue(i_obj));
}
现在您正在从字段中获取值 - 某种对象 - 并以此递归调用您的方法。
我不知道这是干什么用的,但很可能在某些时候您需要考虑收款情况。据推测,如果该字段是一个字符串数组,您将希望 return 各个字符串。或者,如果它是某个对象的列表,您需要遍历列表中的项目,而不是 List<T>
.
的成员
我需要创建程序来导航对象结构并打印作为参数提供的任何“结构”的结构。
这些"structs"定义如下:
- 它们只有 public 个属性
- 每个属性可以是以下类型:
- “结构”
- 原始类型(例如 int)、原始包装器(例如 Integer)或 String
问题是当我试图打印 class 或结构的数据成员时。 我正在尝试编写一个递归函数来获取一个对象并检查对象中的每个字段:如果它是 class 它们,我再次将 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 中获取真实对象??
对于 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);
}
}
}
当你这样做时:
if(memberType.IsClass)
{
getObj(member);
}
您正在递归调用该方法,但您传回给它的是 member
,这是一个 FieldInfo
。因此,不是递归地查看字段值的字段,而是查看 System.Reflection.FieldInfo
的属性,我确定这不是您想要的。
也许你想要的是:
if(memberType.IsClass)
{
getObj(member.GetValue(i_obj));
}
现在您正在从字段中获取值 - 某种对象 - 并以此递归调用您的方法。
我不知道这是干什么用的,但很可能在某些时候您需要考虑收款情况。据推测,如果该字段是一个字符串数组,您将希望 return 各个字符串。或者,如果它是某个对象的列表,您需要遍历列表中的项目,而不是 List<T>
.