簡體   English   中英

如何打印所有嵌套對象屬性名稱

[英]How to print all nested object properties name

我正在嘗試從一個對象打印所有屬性名稱,包括它的子對象的所有屬性名稱,例如

public class Student
{
    public int Id { get; set; }
    public List<Subject> Subjects { get; set; }
}
public class Subject
{
    public string Code { get; set; }
    public ScoreCalculator ScoreCalculator { get; set; }
}
public class ScoreCalculator
{
    public double Score { get; set; }
    public bool Pass { get; set; }
}

學生是父對象。

Subject 是 Student 的子對象。

ScoreCalculator 是 Subject 的子對象。

我期望看到的

Id
Code
Score
Pass

我嘗試了以下方法。 它只能打印父屬性名稱。

public static void PrintAllPropertiesNames<T>(T parentObject, int remainingLayersToGo = 3)
{
    PropertyDescriptorCollection propertyDescriptorCollection = TypeDescriptor.GetProperties(typeof(T));

    foreach (PropertyDescriptor eachPropertyDescriptor in propertyDescriptorCollection)
    {
        Type type = eachPropertyDescriptor.PropertyType;

        //if(remainingLayersToGo > 0 && type is IEnumerable || type is Object) <- @I was trying to recognize data type.
        if (remainingLayersToGo > 0 && false)
        {
            var childObject = eachPropertyDescriptor.GetValue(parentObject);
            PrintAllPropertiesNames(childObject, remainingLayersToGo--);
        }
        else
        {
            Console.WriteLine(eachPropertyDescriptor.Name);
        }
    }
}

@這是不正確的。 我不知道如何識別對象(主題、分數計算器)、枚舉(數組、列表)和普通數據類型(字符串、整數和雙精度)

我認為反射是解決這個問題的首選工具。 通過反射,可以檢查對象的每一個小細節。 困難在於檢查導致預期目標的對象的正確細節。 並為它找到合適的功能。 以下示例的基礎是您問題的源代碼。

注意:下面的例子真的不是很好的編程風格,它只是為了展示一種用反射檢查對象的方法。

首先,我為相應的類提供了構造函數,以便創建整個對象的依賴關系。

public class Student
{
    public Student()
    {
        var subject1 = new Subject();
        List<Subject> Subjects = new List<Subject>();
        Subjects.Add(subject1);
    }
    
    public int Id { get; set; }
    public List<Subject> Subjects { get; set; }
}

public class Subject
{
    public Subject()
    {
        ScoreCalculator = new ScoreCalculator();
    }
        
    public string Code { get; set; }
    public ScoreCalculator ScoreCalculator { get; set; }
}

public class ScoreCalculator
{
    public double Score { get; set; }
    public bool Pass { get; set; }
}

接下來,創建對象並將其傳遞給方法。

public static void Main()
{
    var student = new Student();
    PrintAllPropertiesNames(student);
}

該方法僅顯示了可用可能性的一小部分。 但它顯示了一種如何檢查對象的方法。

public static void PrintAllPropertiesNames<T>(T obj)
{
    if(obj == null) throw new ArgumentNullException(nameof(obj));
            
    var objType = obj.GetType();
    Console.WriteLine($"{objType.Name} Properties:");
            
    var objProperties = objType.GetProperties();
    foreach(var property in objProperties)
    {
        Console.WriteLine($"    + {property.Name}");
    }
            
    var propertySubjects = objType.GetProperty("Subjects");
    Console.WriteLine();
    Console.WriteLine($"{propertySubjects.Name} Info:");
    Console.WriteLine($"    + Type: {propertySubjects.PropertyType}");
            
    var subjectsArguments = propertySubjects.PropertyType.GetGenericArguments();
    foreach(var argument in subjectsArguments)
    {
        Console.WriteLine($"    + Generic Argument: {argument.Name}");
    }
    Console.WriteLine();
            
    var subjectType = subjectsArguments[0];
    var subjectProperties = subjectType.GetProperties();
    Console.WriteLine($"{subjectType.Name} Properties:");
    foreach(var property in subjectProperties)
    {
        Console.WriteLine($"    + {property.Name}");
    }
    Console.WriteLine();
            
    var scoreCalculater = subjectType.GetProperty("ScoreCalculator");
    Console.WriteLine($"{scoreCalculater.Name} Properties:");
    var scoreCalculatorProperties = scoreCalculater.PropertyType.GetProperties();
    foreach(var property in scoreCalculatorProperties)
    {
        Console.WriteLine($"    + {property.Name}");
    }
}

該示例產生以下輸出。

Student Properties:
    + Id
    + Subjects

Subjects Info:
    + Type: System.Collections.Generic.List`1[HelloWold.Subject]
    + Generic Argument: Subject

Subject Properties:
    + Code
    + ScoreCalculator

ScoreCalculator Properties:
    + Score
    + Pass
 

我可以推薦 MSDN 來深入探討這個主題: Reflection inC#

我希望我能幫助你。

暫無
暫無

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

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