获取对象的完整字符串表示形式(如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"
获取对象及其所有值的字符串表示形式对于日志记录非常有用。有没有一种既好又简单的方法来实现这一点?
我猜即时窗口使用反射来循环所有字段和属性,但我想我应该问一下,以防已经存在一些实用程序函数或任何东西来做它。
这将把所有字段存储在字典中(确保它们可以首先读取):
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。