.NET中是否内置了一种方法,可以将对象的所有属性写入控制台?
当然可以使用反射,但我很好奇这是否已经存在了,特别是你可以在Visual Studio的即时窗口中实现它。在那里,您可以键入一个对象名称(在调试模式下),按enter键,它就会相当漂亮地打印出所有内容。
这样的方法存在吗?
.NET中是否内置了一种方法,可以将对象的所有属性写入控制台?
当然可以使用反射,但我很好奇这是否已经存在了,特别是你可以在Visual Studio的即时窗口中实现它。在那里,您可以键入一个对象名称(在调试模式下),按enter键,它就会相当漂亮地打印出所有内容。
这样的方法存在吗?
当前回答
我不这么认为。我总是不得不写它们或者使用别人的工作来获得这些信息。据我所知,这是一种反思。
编辑: 看看这个。我正在调查一些长对象图的调试,并注意到这一点,当我添加手表时,VS在这个类中抛出:Mscorlib_CollectionDebugView<>。它是一种内部类型,用于在监视窗口/代码调试模式中很好地显示集合。现在因为它是内部的,你可以引用它,但你可以使用Reflector复制(从mscorlib)的代码,并有自己的(上面的链接有一个复制/粘贴的例子)。看起来真的很有用。
其他回答
任何其他解决方案/库最终都将使用反射来内省类型…
我不这么认为。我总是不得不写它们或者使用别人的工作来获得这些信息。据我所知,这是一种反思。
编辑: 看看这个。我正在调查一些长对象图的调试,并注意到这一点,当我添加手表时,VS在这个类中抛出:Mscorlib_CollectionDebugView<>。它是一种内部类型,用于在监视窗口/代码调试模式中很好地显示集合。现在因为它是内部的,你可以引用它,但你可以使用Reflector复制(从mscorlib)的代码,并有自己的(上面的链接有一个复制/粘贴的例子)。看起来真的很有用。
你可以使用TypeDescriptor类来做到这一点:
foreach(PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
{
string name = descriptor.Name;
object value = descriptor.GetValue(obj);
Console.WriteLine("{0}={1}", name, value);
}
类型描述符存在于系统中。ComponentModel命名空间,是Visual Studio用来在属性浏览器中显示对象的API。它最终基于反射(就像任何解决方案一样),但是它从反射API提供了一个相当好的抽象级别。
关于Sean回复的TypeDescriptor(我不能评论,因为我的名声不好)…与GetProperties()相比,使用TypeDescriptor的一个优点是TypeDescriptor有一种在运行时动态地将属性附加到对象的机制,而正常的反射将错过这些属性。
例如,当使用PowerShell的PSObject时,PSObject可以在运行时添加属性和方法,他们实现了一个自定义的TypeDescriptor,该TypeDescriptor将这些成员与标准成员集合并在一起。通过使用TypeDescriptor,您的代码不需要知道这个事实。
组件,控件,我认为数据集也会使用这个API。
这正是反思的意义所在。我不认为有更简单的解决方案,但反射并不需要大量代码。