C# 列出对象属性,如VisualStudio即时窗口
我在会话中存储了一些类。我希望能够在跟踪查看器中查看类属性的值。默认情况下,我只使用类型名MyNamespace.MyClass。我想知道我是否覆盖了.ToString()方法,并使用反射来循环所有属性并构造这样的字符串。。。它可以做到这一点,但只是想看看是否有什么东西已经存在了(特别是因为即时窗口有这个功能),它也有同样的功能。。。i、 e.在跟踪中列出类属性值,而不仅仅是类的名称。您可以尝试以下方法:C# 列出对象属性,如VisualStudio即时窗口,c#,reflection,C#,Reflection,我在会话中存储了一些类。我希望能够在跟踪查看器中查看类属性的值。默认情况下,我只使用类型名MyNamespace.MyClass。我想知道我是否覆盖了.ToString()方法,并使用反射来循环所有属性并构造这样的字符串。。。它可以做到这一点,但只是想看看是否有什么东西已经存在了(特别是因为即时窗口有这个功能),它也有同样的功能。。。i、 e.在跟踪中列出类属性值,而不仅仅是类的名称。您可以尝试以下方法: static void Dump(object o, TextWriter output)
static void Dump(object o, TextWriter output)
{
if (o == null)
{
output.WriteLine("null");
return;
}
var properties =
from prop in o.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
where prop.CanRead
&& !prop.GetIndexParameters().Any() // exclude indexed properties to keep things simple
select new
{
prop.Name,
Value = prop.GetValue(o, null)
};
output.WriteLine(o.ToString());
foreach (var prop in properties)
{
output.WriteLine(
"\t{0}: {1}",
prop.Name,
(prop.Value ?? "null").ToString());
}
}
当然,这不是很有效,因为反射。。。更好的解决方案是为每个特定类型动态生成和缓存转储程序方法
编辑:这里有一个改进的解决方案,它使用Linq表达式为每种类型生成专门的转储程序方法。稍微复杂一点;)
这是我使用的代码。我发现它非常有用,而且几乎是即时的。代码使用的是Newtonsoft JSON转换器
[System.Obsolete("ObjectDump should not be included in production code.")]
public static void Dump(this object value)
{
try
{
System.Diagnostics.Trace.WriteLine(JsonConvert.SerializeObject(value, Formatting.Indented));
}
catch (Exception exception)
{
System.Diagnostics.Trace.WriteLine("Object could not be formatted. Does it include any interfaces? Exception Message: " + exception.Message);
}
}
将其添加到公共库中,引用它并将其添加到using子句中。可以通过键入YourObject.Dump()在即时窗口中使用(与在linqpad中的操作完全相同)
包含接口的类必须以不同方式处理,因为这只是一个JSON转换器。对于包含我使用的接口实现的类,一个变通方法是删除默认的空构造函数,并使用接口的特定实例实现构造函数
我发现JSON是一个非常容易阅读的格式,考虑这个小方法对于调试来说是非常宝贵的。
托马斯,谢谢,这看起来是一个很好的解决方案,但我仍然使用.NET 3.5,所以像TraceTelable,Expple,Buffor()等不允许我编译。Dumper.Dump(myObject, Console.Out);
[System.Obsolete("ObjectDump should not be included in production code.")]
public static void Dump(this object value)
{
try
{
System.Diagnostics.Trace.WriteLine(JsonConvert.SerializeObject(value, Formatting.Indented));
}
catch (Exception exception)
{
System.Diagnostics.Trace.WriteLine("Object could not be formatted. Does it include any interfaces? Exception Message: " + exception.Message);
}
}