C#打印对象的所有成员的值

本文关键字:成员 对象 打印 | 更新日期: 2023-09-27 18:29:55

我正在尝试遍历一个对象,并打印该对象每个成员的所有值。

我在下面创建了一个测试程序

public class Employee : Person
{
    public int  Salary { get; set; }
    public int ID { get; set;}
    public ICollection<ContactInfo> contactInfo { get; set; }
    public EmployeeValue value { get; set; }
    public Employee()
    {
        contactInfo = new List<ContactInfo>();
    }
}
public class Person
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public bool IsMale { get; set; }
}
public class ContactInfo
{
    public string email { get; set; }
    public string phoneNumber { get; set; }
}
public class EmployeeValue
{
    public int IQ { get; set; }
    public int Rating { get; set; }
}

然后,我用一些测试数据为对象播种。填充对象后,我尝试遍历所有成员并显示它们的值。

static void Main(string[] args)
    {
        Seed initSeed = new Seed();
        object obj = initSeed.getSomebody();
        foreach (var p in obj.GetType().GetProperties())
        {
            DisplayProperties(p, obj);
        }           
        Console.WriteLine("done");
        Console.ReadKey(true);
    }
static void DisplayProperties(PropertyInfo p, object obj)
    {
        Type tColl = typeof(ICollection<>);
        Type t = p.PropertyType;
        // If this is a collection of objects
        if (t.IsGenericType && tColl.IsAssignableFrom(t.GetGenericTypeDefinition()) ||
            t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == tColl))
        {
            System.Collections.IList a = (System.Collections.IList)p.GetValue(obj, null);
            foreach (var b in a)
            {
                foreach(PropertyInfo x in b.GetType().GetProperties())
                {
                    DisplayProperties(x, b);
                }
            }
        }
        // If this is a custom object
        else if (Convert.ToString(t.Namespace) != "System")
        {
            foreach (PropertyInfo nonPrimitive in t.GetProperties())
            {
                DisplayProperties(nonPrimitive, obj);
            }
        }
           // if this is .net framework object
        else
        {
            Console.WriteLine(p.GetValue(obj, null));
        }
    }

命名空间为时出现问题!="系统",即它是一个自定义对象。如这行所示;else if (Convert.ToString(t.Namespace) != "System")

在函数递归并进入最后的else语句后,我得到

"对象与目标类型不匹配。"

不知怎么的,我需要得到一个内部对象的对象引用。

有人有什么建议吗?

C#打印对象的所有成员的值

尝试更改

DisplayProperties(nonPrimitive, obj);

DisplayProperties(nonPrimitive, p.GetValue(obj, null));

然而,只有在

EmployeeValue value {get;set;}

不为null。否则,它将抛出另一个异常。

您可以简单地重写Employee类的toSting()方法。

重写为字符串()

然后员工将知道如何展示自己。它可以打印在控制台上

Console.WriteLine(employee);