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
相关产品推荐
相关产品推荐

