TypeDescriptor.GetProperties()vs Type.GetProperties()
-
05-07-2019 - |
题
请考虑以下代码。
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();
解决方案
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
对象的间接。您可以像 PropertyInfo
对象一样使用 PropertyDescriptor
对象:它们可用于获取和设置属性的值,并且它们具有属性。
对于WPF中的 DependencyObject
实例, TypeDescriptor.GetProperties()
也返回附加属性。在这种情况下,这些 PropertyDescriptor
对象提供了依赖对象模型的间接,而不是反射。
在组件设计器中,可以使用 ICustomTypeDescriptor
或 TypeDescriptionProviderAttribute
(以及其他一些技术)来创建自己的 PropertyDescriptor
对象在运行时或在设计时。在任何情况下,从 Type.GetProperties()
返回的属性可能与 TypeDescriptor
返回的属性有很大不同,具体取决于上下文。