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

时间:2011-07-14 14:47:11

标签: c# .net 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;
    }
}

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

{MyClass}
    D: {11.11.2011 00:00:00}
    F: 3.14
    I: 42
    l: 12435
    S: "foo"

获取对象及其所有值的字符串表示形式对于日志记录非常有用。有没有一种简单易行的方法来实现这一目标?

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

4 个答案:

答案 0 :(得分:11)

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

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

您可以轻松修改此项,以便将每个名称/值附加到StringBuilder对象而不是字典,并将其转储到文件中。

答案 1 :(得分:3)

如果你想要一个对象的序列化版本,我可能会在你的日志记录中使用JavaScriptSerializer

public void LogObject(object obj)
{
    var serializer = new JavaScriptSerializer();
    var objString = serializer.Serialize(obj);

    WriteLog(objString);
}

答案 2 :(得分:1)

您可以使用Reflection并迭代所有字段和属性,在每个结果上调用ToString()。如果当前字段/属性是类/结构,则可以递归地执行此操作(如果需要)。

其次,有些类使用DebuggerDisplayAttribute,但你需要解析那个AFAICT。

答案 3 :(得分:0)

如果您只想记录(即打印)对象的表示,请覆盖ToString方法。

  

ToString是.NET Framework中的主要格式化方法。它将对象转换为字符串表示形式,以便适合显示。

此外,如果您想提供多种方式来输出字符串(例如,为了支持详细或最小选项),您还可以考虑实施IFormattable