TypeDescriptor.GetProperties()与Type.GetProperties()的区别

38

考虑以下代码。

Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperties();
我试图理解A和B之间的区别。据我所知,TypeDescriptor.GetProperties()将返回自定义的TypeDescriptor属性,而Type.GetProperties()仅返回对象的基本“实际”属性。这是正确的吗?如果obj没有任何自定义的TypeDescriptor属性,则它会默认返回对象的字面基本属性。
3个回答

21

obj.GetType().GetProperties()方法返回的是System.Reflection.PropertyInfo[]数组,而不是PropertyDescriptorCollection。正如你所说,PropertyInfo类只代表了在对象上实际创建的属性。一个PropertyDescriptor要么是PropertyDescriptor类的自定义具体子类(由定义自定义描述符的类型实现),要么是使用PropertyInfo类提供属性动态调用的封闭内部类ReflectPropertyDescriptor的实例。

因此,对于没有定义自定义描述符的类,您将获得相同的对象,虽然PropertyDescriptor正在抽象化PropertyInfo


10

TypeDescriptor 类返回表示 obj 的类型中的属性以及对象本身或其类型贡献的任何其他属性的 PropertyDescriptor 对象。

组件模型实际上非常复杂,但如您所描述,TypeDescriptor.GetProperties() 的基本实现将返回表示典型的 PropertyInfo 对象的间接引用的 ReflectPropertyDescriptor 实例。 您可以像使用 PropertyInfo 对象一样使用 PropertyDescriptor 对象:它们可以用于获取和设置属性的值,并具有属性。

对于 WPF 中的 DependencyObject 实例,TypeDescriptor.GetProperties() 还会返回附加属性。 在这种情况下,这些 PropertyDescriptor 对象提供了一种间接引用依赖对象模型而不是反射。

在组件设计器中,可以使用 ICustomTypeDescriptorTypeDescriptionProviderAttribute(以及其他一些技术)在运行时或设计时创建自己的 PropertyDescriptor 对象。 在任何情况下,从 Type.GetProperties() 返回的属性可能与从 TypeDescriptor 返回的属性不同,具体取决于上下文。


10

TypeDescriptor 类用于设计师与设计时环境的交互。特别地,设计师可以重写和扩展各种 TypeDescriptor 的特性,但不能操作 Type

一个很好的例子是在使用数据绑定控件时。 DataSource 属性的类型为 System.Object,但在设计时,该属性会被替换为一个具有更丰富设计时 UI 的新属性。


它被设计师使用,但也用于数据绑定,因此它不仅仅是一种设计时技术。 - Adam Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接