获取对象的完整字符串表示形式(如在Visual Studio中的立即窗口中)

Jul*_*ian 13 .net c# debugging logging

给出以下示例类:

public class MyClass
{
    public string S { get; set; }
    public int I { get; set; }
    public DateTime D { get; set; }
    private float F { get; set; }
    private long l;

    public MyClass()
    {
        S = "foo";
        I = 42;
        D = new DateTime(2011, 11, 11);
        F = 3.14f;
        l = 12435;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在我的应用程序中有myClass这个类的实例,请在调试模式(Visual Studio 2010)中逐步执行代码,并在某些时候将myClass类型转换为立即窗口,将显示以下内容:

{MyClass}
    D: {11.11.2011 00:00:00}
    F: 3.14
    I: 42
    l: 12435
    S: "foo"
Run Code Online (Sandbox Code Playgroud)

获取对象及其所有值的字符串表示形式对于日志记录非常有用.有没有一个很好的方法来实现这一目标?

我猜立即窗口使用反射来循环所有字段和属性,但我想我会问,以防万一已存在一些效用函数或任何事情.

Gra*_*ICA 12

这将把所有字段存储在字典中(确保它们可以先读取):

public static Dictionary<string, object> GeneratePropertiesDictionary(object myClass)
{
    return myClass.GetType()
                  .GetProperties()
                  .Where(p => p.CanRead)
                  .ToDictionary(p => p.Name, p => p.GetValue(myClass, null));
}
Run Code Online (Sandbox Code Playgroud)

您可以轻松地修改它以将每个名称/值附加到StringBuilder对象而不是字典,然后将其转储到文件中.

  • 感谢您分享您的功能.我希望可能有一些现有的实用功能可以使用,但似乎使用反射是自己的方式.我可能没有直接使用你的代码,但我认为我将修改一个ObjectDumper.cs版本(http://code.msdn.microsoft.com/LINQ-Sample-Queries-13a42a54/sourcecode?fileId=23655&pathId从MSDN的LINQ示例查询中获得= 2145124756). (2认同)