请考虑以下代码。

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 返回的属性有很大不同,具体取决于上下文。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top