TypeDescriptor.GetProperties()vs Type.GetProperties()
请考虑以下代码。
Object obj; PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj); PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT*
我试图理解A和B之间的区别。据我所知, TypeDescriptor.GetProperties()将返回自定义的TypeDescriptor属性,其中Type.GetProperties()只返回对象的内在“真实”属性。 这是正确的吗? 如果obj没有任何自定义的TypeDescriptor属性,那么它只是默认返回对象的文字内在属性。
* EDIT之前的第二行代码(返回值错误):
PropertyDescriptorCollection B = obj.GetType()。GetProperties();
obj.GetType().GetProperties()
不返回PropertyDescriptorCollection
,它返回System.Reflection.PropertyInfo[]
。 正如您所建议的那样, PropertyInfo
类仅表示在对象上创建的实际属性。 PropertyDescriptor
是PropertyDescriptor
类的自定义具体子级(由定义自定义描述符的类型实现),或者是使用PropertyInfo
类提供属性动态调用的密封内部类ReflectPropertyDescriptor
的实例。
因此,对于没有定义自定义描述符的类,您将在function上获取相同的对象,尽管PropertyDescriptor
正在抽象掉PropertyInfo
。
TypeDescriptor
类在设计器中使用,以便它们可以与设计时环境进行交互。 特别是,设计人员可以覆盖和扩展TypeDescriptor
各种function,但不能覆盖Type
。
一个很好的例子是使用数据绑定控件。 DataSource
属性的类型为System.Object
,但在设计时,该属性将替换为具有更丰富的设计时UI的新属性。
TypeDescriptor
类返回PropertyDescriptor
对象,这些对象表示obj
类型中的属性以及贡献给对象本身或其类型的任何其他属性。
组件模型实际上非常复杂,但正如您所描述的, TypeDescriptor.GetProperties()
的基本实现将返回表示与典型PropertyInfo
对象间接的ReflectPropertyDescriptor
实例。 您可以像使用PropertyDescriptor
对象一样使用PropertyInfo
对象:它们可用于获取和设置属性的值,并且它们具有属性。
对于WPF中的DependencyObject
实例, TypeDescriptor.GetProperties()
也返回附加属性。 在这种情况下,这些PropertyDescriptor
对象提供了依赖对象模型的间接,而不是reflection。
在组件设计器中,可以使用ICustomTypeDescriptor
或TypeDescriptionProviderAttribute
(可能还有一些其他技术)在运行时或设计时创建自己的PropertyDescriptor
对象。 在任何情况下, Type.GetProperties()
返回的属性可能与TypeDescriptor
返回的属性有很大不同,具体取决于上下文。