TypeDescriptor.GetProperties()vs Type.GetProperties()

时间:2009-09-09 21:36:56

标签: c# reflection types typedescriptor

请考虑以下代码。

Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT*

我正在尝试理解A和B之间的区别。根据我的理解 TypeDescriptor.GetProperties()将返回自定义 TypeDescriptor 属性,其中 Type.GetProperties()只返回对象的内在“真实”属性。这是正确的吗?如果obj没有任何自定义 TypeDescriptor 属性,那么它只是默认返回对象的文字内在属性。


*原始编辑前的第二行代码(返回值错误):

  

PropertyDescriptorCollection B = obj.GetType()。GetProperties();

3 个答案:

答案 0 :(得分:18)

obj.GetType().GetProperties()未返回PropertyDescriptorCollection,它会返回System.Reflection.PropertyInfo[]。正如您所建议的那样,PropertyInfo类仅表示在对象上创建的实际属性。 PropertyDescriptorPropertyDescriptor类的自定义具体子级(由定义自定义描述符的类型实现),或者是使用{{{}的密封内部类ReflectPropertyDescriptor的实例。 1}}类提供属性的动态调用。

因此,对于没有定义自定义描述符的类,您将在功能上获取相同的对象,尽管PropertyInfo正在抽象出PropertyDescriptor

答案 1 :(得分:9)

设计师使用TypeDescriptor类,以便他们可以与设计时环境进行交互。特别是,设计人员可以覆盖和扩展TypeDescriptor的各种功能,但不能覆盖Type

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

答案 2 :(得分:8)

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

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

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

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