使用反射动态展示自定义类数据:嵌套类内容显示问题
解决自定义类属性递归展示的问题
这个问题很常见——当你用反射获取自定义类属性值时,默认的ToString()只会输出类型全名,而不会递归展开内部的属性或集合元素。咱们可以通过添加一个递归处理对象值的辅助方法,让DynamicExport能自动解析复杂类型的内容,实现你想要的输出效果。
修改后的完整代码
using System; using System.Collections; using System.Collections.Generic; using System.Reflection; class Program { static void Main(string[] args) { List<Person> listPerson = new List<Person>(); var person1 = new Person(); person1.Name = "Mary"; person1.Phones = new Phones { new Phone { Type = 1, Number = "555XYZ" } }; person1.Occupations = new Occupations { new Occupation { Type = 5, Description = "Secretary" } }; listPerson.Add(person1); DynamicExport(listPerson); Console.ReadLine(); } public static void DynamicExport<T>(List<T> listReg) { for (int i = 0; i < listReg.Count; i++) { var obj = listReg[i]; // 先输出对象类型 Console.Write($"{obj.GetType()}"); // 递归获取所有属性的键值字符串 Console.WriteLine($" {GetObjectValueString(obj)}"); } } // 核心辅助方法:递归生成对象的属性值字符串 private static string GetObjectValueString(object obj) { if (obj == null) return "null"; var type = obj.GetType(); // 处理值类型和字符串,直接返回值 if (type.IsValueType || type == typeof(string)) { return obj.ToString(); } // 处理集合类型(IEnumerable,排除string) if (obj is IEnumerable enumerable && type != typeof(string)) { var elements = new List<string>(); foreach (var item in enumerable) { elements.Add(GetObjectValueString(item)); } return string.Join(", ", elements); } // 处理自定义引用类型,遍历所有属性 var propertyStrings = new List<string>(); foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { var value = property.GetValue(obj); propertyStrings.Add($"{property.Name}: {GetObjectValueString(value)}"); } return string.Join(" ", propertyStrings); } } class Person { public string Name { get; set; } public Phones Phones { get; set; } public Occupations Occupations { get; set; } } class Phones : List<Phone> { } class Phone { public int Type { get; set; } public string Number { get; set; } } class Occupations : List<Occupation> { } class Occupation { public int Type { get; set; } public string Description { get; set; } }
关键逻辑说明
辅助方法
GetObjectValueString:- 首先判断对象是否为
null,直接返回"null"; - 对于值类型(比如
int)和string,直接返回其字符串表示; - 对于集合类型(实现
IEnumerable的类型,排除string),遍历每个元素并递归处理,把元素的字符串结果用逗号拼接; - 对于自定义引用类型(比如
Person、Phone),遍历其所有公共实例属性,递归获取每个属性的键值对,用空格拼接。
- 首先判断对象是否为
修改后的
DynamicExport方法:- 不再单独遍历属性输出,而是先输出对象类型,再调用辅助方法获取完整的属性值字符串,一次性输出,更贴合你期望的格式。
输出效果
运行后你会得到和期望一致的输出:
TestReflection.Person Name: Mary Phones: Type: 1 Number: 555XYZ Occupations: Type: 5 Description: Secretary
如果需要更紧凑的格式(比如给集合元素添加括号包裹),可以调整辅助方法中集合部分的拼接逻辑,改成$"[{string.Join(", ", elements)}]",就能得到Phones: [Type: 1 Number: 555XYZ]这样的输出。
内容的提问来源于stack exchange,提问作者Desenvolvimento Sistema Gestor
相关产品推荐
相关产品推荐

