簡體   English   中英

如何將fieldinfo轉換為其實際的類對象? 使用C#

[英]How to convert fieldinfo to it's actual class object? using C#

我需要創建一個導航對象結構並打印任何作為參數提供的“結構”的結構的程序。

這些“結構”的定義如下:

  • 它們只有公共屬性
  • 每個屬性可以具有以下類型:
    • “結構”
    • 原始(例如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獲取真實對象?

對於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>的成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM