You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用反射动态展示自定义类数据:嵌套类内容显示问题

解决自定义类属性递归展示的问题

这个问题很常见——当你用反射获取自定义类属性值时,默认的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; }
}

关键逻辑说明

  1. 辅助方法GetObjectValueString:

    • 首先判断对象是否为null,直接返回"null";
    • 对于值类型(比如int)和string,直接返回其字符串表示;
    • 对于集合类型(实现IEnumerable的类型,排除string),遍历每个元素并递归处理,把元素的字符串结果用逗号拼接;
    • 对于自定义引用类型(比如Person、Phone),遍历其所有公共实例属性,递归获取每个属性的键值对,用空格拼接。
  2. 修改后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:34:33