![](/img/trans.png)
[英]How to print all property values of an object without naming the properties explicitly
[英]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.