给出以下示例类:
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"
获取对象及其所有值的字符串表示形式对于日志记录非常有用。有没有一种简单易行的方法来实现这一目标?
我猜立即窗口使用反射来遍历所有字段和属性,但我想我会问,以防万一已存在一些效用函数或任何事情。
答案 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。