📜  C# 打印对象的所有属性,包括子对象 - C# (1)

📅  最后修改于: 2023-12-03 14:59:42.417000             🧑  作者: Mango

C# 打印对象的所有属性,包括子对象

在C#中,我们可以使用反射来打印对象的所有属性,包括子对象。反射是一种强大的技术,可以在运行时获取和操作类型的信息,包括属性、方法和事件等。通过使用反射,我们可以动态地获取对象的属性信息并进行打印。

下面是一个示例代码,展示了如何打印对象的所有属性,包括子对象:

using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        // 创建一个示例对象
        var obj = new MyClass()
        {
            Name = "John",
            Age = 30,
            Address = new Address()
            {
                City = "New York",
                Country = "USA"
            }
        };

        // 打印对象的所有属性
        PrintProperties(obj, 0);

        Console.ReadLine();
    }

    public static void PrintProperties(object obj, int indent)
    {
        if (obj == null) return;

        // 获取对象的类型
        Type type = obj.GetType();

        // 获取对象的所有属性
        PropertyInfo[] properties = type.GetProperties();

        // 遍历属性并打印
        foreach (PropertyInfo property in properties)
        {
            // 添加缩进
            Console.Write(new string(' ', indent));

            // 打印属性名称和值
            Console.WriteLine($"{property.Name}: {property.GetValue(obj)}");

            // 如果属性是一个对象,则递归打印该对象的属性
            if (property.PropertyType.IsClass && property.PropertyType != typeof(string))
            {
                PrintProperties(property.GetValue(obj), indent + 4);
            }
        }
    }
}

public class MyClass
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public string City { get; set; }
    public string Country { get; set; }
}

上述代码定义了一个MyClass类和一个Address类,MyClass类有三个属性:NameAgeAddressAddress属性是一个Address类的对象。在Main方法中,我们创建了一个MyClass对象,并使用PrintProperties方法打印该对象的所有属性,包括子对象。

运行上述代码,将会输出以下结果:

Name: John
Age: 30
Address: Demo.Address
    City: New York
    Country: USA

上述结果展示了对象MyClass的所有属性,其中Address属性是一个子对象。通过递归调用PrintProperties方法,我们打印了子对象Address的所有属性。

希望这个示例能够帮助你了解如何在C#中打印对象的所有属性,包括子对象。