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

本文关键字:Studio Visual 窗口 取对象 字符串 表示 获取 | 更新日期: 2023-09-27 18:02:40

给定以下示例类:

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"

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

我猜即时窗口使用反射来循环所有字段和属性,但我想我应该问一下,以防已经存在一些实用程序函数或任何东西来做它。

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

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

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对象而不是字典中,并将其转储到文件中。

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

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

您可以使用Reflection并遍历所有字段和属性,对每个结果调用ToString()。如果当前字段/属性是一个类/结构,如果你愿意,你可以递归地做到这一点。

其次,一些类使用DebuggerDisplayAttribute,尽管您需要解析该AFAICT。

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

ToString是。net框架中主要的格式化方法。它将对象转换为其字符串表示形式,以便于显示。

另外,如果你想提供多种方式来输出字符串(例如,支持详细或最小选项),你也可以考虑实现iformatable。