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

C#如何实现类似PHP var_dump功能输出变量全量内容到控制台

C# 实现类似PHP var_dump打印对象全量内容的方案

C# 没有提供和PHP var_dump 完全等价的原生方法,直接调用Console.WriteLine(data)默认只会打印Data类的全限定类型名,不会自动遍历输出所有字段/属性的值。以下是三种常用实现方式,可按需选择:

1. 反射实现通用VarDump扩展方法(最接近var_dump效果,零依赖)

通过反射递归遍历任意对象的所有字段、属性,自动处理值类型、字符串、嵌套对象、集合/数组等类型,不管成员是public还是private修饰都能正常打印,通用性最强,效果和PHP var_dump基本一致。
直接把下面的静态工具类放到你的项目里即可:

using System.Reflection;
using System.Collections;

public static class ObjectDumpExtension
{
    public static void VarDump(this object obj, int indentLevel = 0)
    {
        string indent = new string(' ', indentLevel * 2);
        if (obj == null)
        {
            Console.WriteLine($"{indent}NULL");
            return;
        }

        Type objType = obj.GetType();
        // 值类型、字符串、枚举直接输出
        if (objType.IsPrimitive || objType == typeof(string) || objType.IsEnum)
        {
            Console.WriteLine($"{indent}{objType.Name}: {obj}");
            return;
        }

        // 处理数组、列表等集合类型
        if (obj is IEnumerable collection)
        {
            var items = collection.Cast<object>().ToList();
            Console.WriteLine($"{indent}{objType.Name}(count={items.Count}) {{");
            for (int i = 0; i < items.Count; i++)
            {
                Console.Write($"{indent}  [{i}] => ");
                items[i].VarDump(indentLevel + 2);
            }
            Console.WriteLine($"{indent}}}");
            return;
        }

        // 处理普通类/结构体,遍历所有实例字段和属性
        Console.WriteLine($"{indent}object({objType.Name}) {{");
        // 遍历所有实例字段(含私有)
        foreach (FieldInfo field in objType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
        {
            Console.Write($"{indent}  {field.Name}: ");
            field.GetValue(obj).VarDump(indentLevel + 2);
        }
        // 遍历所有实例属性(含私有,跳过索引器)
        foreach (PropertyInfo prop in objType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
        {
            if (prop.GetIndexParameters().Length > 0) continue;
            try
            {
                Console.Write($"{indent}  {prop.Name}: ");
                prop.GetValue(obj).VarDump(indentLevel + 2);
            }
            catch { // 忽略无法读取的属性 }
        }
        Console.WriteLine($"{indent}}}");
    }
}

使用方式非常简单,任意对象直接调用扩展方法即可:

var data = new Data();
data.VarDump();

2. JSON序列化快速打印(调试场景最便捷)

如果只是临时调试查看对象内容,不需要严格匹配var_dump格式,可以直接把对象序列化为带缩进的JSON字符串输出,无需额外写工具逻辑。使用.NET内置的JSON序列化能力即可实现:

using System.Text.Json;

var data = new Data();
var jsonOpt = new JsonSerializerOptions
{
    WriteIndented = true,
    IncludeFields = true, // 配置后可打印字段,默认仅打印public属性
};
Console.WriteLine(JsonSerializer.Serialize(data, jsonOpt));

注意:该方式默认仅支持打印public成员,如果需要打印私有成员需要自定义序列化转换器,适合快速调试public数据的场景。

3. 重写ToString()方法(固定类定制场景)

如果你只需要给特定类定制打印输出逻辑,可以重写类的ToString()方法,重写完成后直接调用Console.WriteLine(data)就会输出你自定义的内容,性能最好但通用性差:

class Data {
    // 注意:C#中类成员定义需要用分号结尾,你示例代码里的逗号是语法错误
    int total_data = 21;
    int total_page = 1;
    int page = 1;
    int limit = 21;

    public override string ToString()
    {
        return $"Data {{\n  total_data: {total_data},\n  total_page: {total_page},\n  page: {page},\n  limit: {limit}\n}}";
    }
}

// 直接调用即可输出定制内容
var data = new Data();
Console.WriteLine(data);

补充说明:你提供的示例代码中类的字段使用逗号分隔属于C#语法错误,类成员定义末尾需要使用分号结尾。

内容的提问来源于stack exchange,提问作者user123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:09:20