38

考虑以下代码。

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

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

4

3 回答 3

21

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

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

于 2009-09-09T21:50:58.983 回答
10

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

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

于 2009-09-09T21:50:36.970 回答
10

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

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

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

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

于 2011-01-24T09:08:56.493 回答