TypeDescriptor.GetProperties()vs Type.GetProperties()

Eri*_*tas 32 c# reflection types typedescriptor

请考虑以下代码.

Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT*
Run Code Online (Sandbox Code Playgroud)

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


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

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

Ada*_*son 18

obj.GetType().GetProperties()不返回PropertyDescriptorCollection,它返回一个System.Reflection.PropertyInfo[].该PropertyInfo班呢,你的建议,表示对对象只创建实际属性.A PropertyDescriptorPropertyDescriptor类的自定义具体子级(由定义自定义描述符的类型实现),或者是ReflectPropertyDescriptor使用PropertyInfo该类提供属性的动态调用的密封内部类的实例.

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


Joh*_*ers 9

TypeDescriptor班是设计师使用,使他们能够与设计时环境交互.特别是,设计师可以覆盖和扩展各种功能TypeDescriptor,但不能Type.

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


小智 8

TypeDescriptor类返回PropertyDescriptor表示在的类型的属性的对象obj,以及作为被对象本身或其类型贡献的任何其他属性.

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

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

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