考虑下面的代码。
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();
obj.GetType().GetProperties()
不返回PropertyDescriptorCollection
,它返回一个System.Reflection.PropertyInfo[]
该PropertyInfo
类呢,你的建议,表示对对象只创建实际属性。 甲PropertyDescriptor
要么是所述的自定义具体儿童PropertyDescriptor
类(通过定义定制描述符类型来实现),或者是密封的内部类的实例ReflectPropertyDescriptor
,它使用PropertyInfo
类,以提供该属性的动态调用。
因此,对于没有定义自定义描述符一类,你会得到功能相同的对象回来,虽然PropertyDescriptor
被抽象掉PropertyInfo
。
该TypeDescriptor
类是在设计师使用,使他们能够与设计时环境交互。 特别是,设计师可以覆盖和扩展的各种功能TypeDescriptor
,而不是Type
。
一个很好的例子正在与数据绑定控件。 该DataSource
属性的类型是System.Object
,但在设计时,该属性被替换为拥有更丰富的设计时UI的新属性。
所述TypeDescriptor
类返回PropertyDescriptor
表示在的类型的属性的对象obj
以及该被对象本身或其类型贡献的任何其他属性。
组件模型实际上是相当复杂的,但是当你形容,基本实现TypeDescriptor.GetProperties()
将返回ReflectPropertyDescriptor
代表的间接典型实例PropertyInfo
对象。 您可以使用PropertyDescriptor
对象非常像PropertyInfo
对象:它们可以被用来获取和设置属性的价值,他们有属性。
为DependencyObject
在WPF情况下, TypeDescriptor.GetProperties()
也返回附加属性。 这些PropertyDescriptor
在这种情况下对象提供的间接所述依赖关系的对象模型,而不是反射。
在组件设计,可以使用ICustomTypeDescriptor
或TypeDescriptionProviderAttribute
(也许其他一些技术)来创建自己PropertyDescriptor
在运行时或在设计时对象。 在任何情况下,可能的是,从属性返回Type.GetProperties()
可能与从返回很好不同TypeDescriptor
,这取决于上下文。