当前位置:  开发笔记 > 编程语言 > 正文

将整个对象转储到C#中的日志的最佳方法是什么?

如何解决《将整个对象转储到C#中的日志的最佳方法是什么?》经验,为你挑选了6个好方法。

因此,为了在运行时查看当前对象的状态,我非常喜欢Visual Studio立即窗口给出的内容.只是做一个简单的

? objectname

将给我一个格式良好的"转储"对象.

有没有一种简单的方法在代码中执行此操作,因此我可以在记录时执行类似的操作?



1> Mike Scott..:

您可以基于Linq示例附带的ObjectDumper代码.
还要看一下这个相关问题的答案,以获得样本.


它也不适用于数组(它只显示数组的类型和长度,但不打印其内容).
[ObjectDumper的nuget包](http://www.nuget.org/packages/ObjectDumper/)现已推出.它还提供了一个扩展方法`DumpToString`和`Dump`到`Object`类.便利.

2> Jason..:

对于更大的对象图,我第二次使用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 Locals窗口的屏幕截图

我正在使用Visual Studio 2013.


SerializeObj - > SerializeObject?

3> Bernhard Hof..:

我确定有更好的方法可以做到这一点,但我过去使用类似下面的方法将对象序列化为一个我可以记录的字符串:

  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;
  }

您将看到该方法也可能返回异常而不是序列化对象,因此您需要确保要记录的对象是可序列化的.


根据在回答问题后添加到C#的功能可能有助于指出此实现作为扩展方法很好地工作.如果应用于Object类并且您在需要的任何地方引用扩展,那么它可以是调用该函数的便捷方式.

4> Matas Vaitke..:

您可以使用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
    }
}

这应该允许你转储任何对象.

希望这能为您节省一些时间.


仅供参考,当您在C#字符串中包含JSON字符串时,请单击字符串右侧的望远镜图标,然后选择“文本可视化工具”。它将打开一个窗口,该窗口显示JSON字符串的纯文本版本(非转义引号或\ r \ n)。

5> mythz..:

我有一个完全正确的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
    }
}


"他没有说田野" - 他说"整个物体",包括田野.他还提到Visual Studio的立即窗口功能作为他想要实现的一个例子(*"只做一个简单的`?objectname`将给我一个格式良好的'转储'对象"*).`?objectname`也打印出所有字段.`这非常有用 - 迄今为止我最常用的扩展方法之一 - 我不是在质疑它是否有用,只是它会转储整个对象.
@KonradMorawski错误**整个对象**表示对象的递归转储,而不是它包含字段,这很容易导致无限递归循环.你不应该假设别人暗示的东西.我的回答既相关又有帮助,你的投票+评论不是.
-1基本上只是一个链接答案,但如果我可以使用它看起来很棒!也许我是瞎子,但是我无法通过那个链接找到来源; 两个上传文件夹都是空的.代码是否太长而无法包含在答案中?

6> Hot Licks..:

这是一个编写扁平对象的简单方法,格式很好:

using Newtonsoft.Json.Linq;

Debug.WriteLine("The object is " + JObject.FromObject(theObjectToDump).ToString());

发生的事情是该对象首先被转换为JSON内部表示JObject.FromObject,然后转换为JSON字符串ToString.(当然,JSON字符串是一个非常好的简单对象表示,特别是因为ToString它将包含换行符和缩进.)"ToString"当然是无关紧要的(因为它是+用于连接字符串和对象所暗示的),但是我有点想在这里说明一下.


JsonConvert.SerializeObject(欣赏,Formatting.Indented),以便在日志中轻松阅读
推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有