因此,为了在运行时查看当前对象的状态,我非常喜欢Visual Studio立即窗口给出的内容.只是做一个简单的
? objectname
将给我一个格式良好的"转储"对象.
有没有一种简单的方法在代码中执行此操作,因此我可以在记录时执行类似的操作?
您可以基于Linq示例附带的ObjectDumper代码.
还要看一下这个相关问题的答案,以获得样本.
对于更大的对象图,我第二次使用Json,但策略略有不同.首先,我有一个易于调用的静态类,并使用一个包装Json转换的静态方法(注意:可以使它成为一个扩展方法).
using Newtonsoft.Json; public static class F { public static string Dump(object obj) { return JsonConvert.SerializeObject(obj); } }
然后在你的Immediate Window
,
var lookHere = F.Dump(myobj);
lookHere会自动显示在Locals
$前面的窗口中,或者你可以添加一个手表.在Value
检查员栏目的右侧,有一个放大镜,旁边有一个下拉插入物.选择下拉插入符并选择Json visualizer.
我正在使用Visual Studio 2013.
我确定有更好的方法可以做到这一点,但我过去使用类似下面的方法将对象序列化为一个我可以记录的字符串:
private string ObjectToXml(object output) { string objectAsXmlString; System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(output.GetType()); using (System.IO.StringWriter sw = new System.IO.StringWriter()) { try { xs.Serialize(sw, output); objectAsXmlString = sw.ToString(); } catch (Exception ex) { objectAsXmlString = ex.ToString(); } } return objectAsXmlString; }
您将看到该方法也可能返回异常而不是序列化对象,因此您需要确保要记录的对象是可序列化的.
您可以使用Visual Studio立即窗口
只需粘贴(actual
显然更改为您的对象名称):
Newtonsoft.Json.JsonConvert.SerializeObject(actual);
它应该用JSON打印对象
您应该能够通过textmechanic文本工具或记事本++复制它\"
,"
并\r\n
使用空行空格替换带有空行符号的换行符(),然后"
从开头和结尾删除双引号()并将其粘贴到jsbeautifier以使其更具可读性.
更新OP的评论
public static class Dumper { public static void Dump(this object obj) { Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(obj)); // your logger } }
这应该允许你转储任何对象.
希望这能为您节省一些时间.
我有一个完全正确的T.Dump()扩展方法,递归地以一种可读的格式转储任何类型的所有属性.
用法示例:
var model = new TestModel(); Console.WriteLine(model.Dump());
并输出:
{ Int: 1, String: One, DateTime: 2010-04-11, Guid: c050437f6fcd46be9b2d0806a0860b3e, EmptyIntList: [], IntList: [ 1, 2, 3 ], StringList: [ one, two, three ], StringIntMap: { a: 1, b: 2, c: 3 } }
这是一个编写扁平对象的简单方法,格式很好:
using Newtonsoft.Json.Linq; Debug.WriteLine("The object is " + JObject.FromObject(theObjectToDump).ToString());
发生的事情是该对象首先被转换为JSON内部表示JObject.FromObject
,然后转换为JSON字符串ToString
.(当然,JSON字符串是一个非常好的简单对象表示,特别是因为ToString
它将包含换行符和缩进.)"ToString"当然是无关紧要的(因为它是+
用于连接字符串和对象所暗示的),但是我有点想在这里说明一下.