TypeDescriptor.GetProperties()VS Type.GetPropertie

2019-07-17 13:45发布

考虑下面的代码。

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

我想知道从我的理解TypeDescriptor.GetProperties(A和B之间的差将返回定制TypeDescriptor特性,其中作为Type.GetProperties()将只返回对象的内在“真实”的特性。 这是正确的吗? 如果obj没有任何自定义TypeDescriptor性能那么它只是默认也返回对象的字面内在特性。


* EDIT(有错误的返回值)之前的代码原件下联:

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

Answer 1:

obj.GetType().GetProperties()不返回PropertyDescriptorCollection ,它返回一个System.Reflection.PropertyInfo[]PropertyInfo类呢,你的建议,表示对对象只创建实际属性。 甲PropertyDescriptor要么是所述的自定义具体儿童PropertyDescriptor类(通过定义定制描述符类型来实现),或者是密封的内部类的实例ReflectPropertyDescriptor ,它使用PropertyInfo类,以提供该属性的动态调用。

因此,对于没有定义自定义描述符一类,你会得到功能相同的对象回来,虽然PropertyDescriptor被抽象掉PropertyInfo



Answer 2:

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

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



Answer 3:

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

组件模型实际上是相当复杂的,但是当你形容,基本实现TypeDescriptor.GetProperties()将返回ReflectPropertyDescriptor代表的间接典型实例PropertyInfo对象。 您可以使用PropertyDescriptor对象非常像PropertyInfo对象:它们可以被用来获取和设置属性的价值,他们有属性。

DependencyObject在WPF情况下, TypeDescriptor.GetProperties()也返回附加属性。 这些PropertyDescriptor在这种情况下对象提供的间接所述依赖关系的对象模型,而不是反射。

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



文章来源: TypeDescriptor.GetProperties() vs Type.GetProperties()