【问题标题】:How to convert fieldinfo to it's actual class object? using C#如何将 fieldinfo 转换为它的实际类对象?使用 C#
【发布时间】:2018-02-20 20:00:15
【问题描述】:

我需要创建导航对象结构并打印作为参数提供的任何“结构”的结构的程序。

这些“结构”定义如下:

  • 它们只有公共属性
  • 每个属性可以是以下类型:
    • “结构”
    • 原始(例如 int)、原始包装(例如 Integer)或字符串

问题是当我尝试打印作为类或结构的数据成员时。 我正在尝试编写一个递归函数来获取一个对象并检查对象中的每个字段:如果它是一个类,我会再次将 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 获取真实对象?

【问题讨论】:

  • 将 null 传递给 GetValue 函数:member.GetValue(null)
  • 你的意思是 member.GetValue(i_obj, null)

标签: c# reflection fieldinfo


【解决方案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);
        }

    }
}

【讨论】:

  • 另外,由于您正在处理类型,所以根本不要传入您的类对象的实例。使用 getObj(Type objType) 作为方法签名并使用 member.FieldType 值进行递归
【解决方案2】:

当你这样做时:

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

您正在递归调用该方法,但您传递回它的是member,即FieldInfo。因此,您无需递归查看字段值的字段,而是查看System.Reflection.FieldInfo 的属性,我确定这不是您想要的。

也许你想要的是这样的:

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

现在您从字段中获取值 - 某种对象 - 并以此递归调用您的方法。

我不知道这是为了什么,但很可能在某些时候您需要考虑收藏。大概如果该字段是一个字符串数组,您将希望返回单个字符串。或者,如果它是某个对象的列表,您需要遍历列表中的项目,而不是 List&lt;T&gt; 的成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多