请考虑以下代码。
Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperties();我试图理解A和B之间的区别,因为我理解TypeDescriptor.GetProperties()将返回自定义TypeDescriptor属性,其中Type.GetProperties()只返回对象的内在“真实”属性。是这样的吗?如果obj没有任何自定义的TypeDescriptor属性,那么它只是默认地返回对象的文本内在属性。
发布于 2009-09-09 21:50:58
obj.GetType().GetProperties()不返回PropertyDescriptorCollection,而是返回System.Reflection.PropertyInfo[]。正如您建议的那样,PropertyInfo类只表示在对象上创建的实际属性。PropertyDescriptor要么是PropertyDescriptor类的自定义具体子类(由定义自定义描述符的类型实现),要么是密封内部类ReflectPropertyDescriptor的实例,它使用PropertyInfo类提供属性的动态调用。
因此,对于不定义自定义描述符的类,您将从功能上获得相同的对象,尽管PropertyDescriptor正在抽象出PropertyInfo。
发布于 2009-09-09 21:50:36
设计器中使用了TypeDescriptor类,以便它们能够与设计时环境进行交互。特别是,设计人员可以覆盖和扩展TypeDescriptor的各种特性,但不能覆盖和扩展Type。
一个很好的例子是使用数据绑定控件。DataSource属性的类型是System.Object,但在设计时,该属性被替换为一个具有更丰富设计时UI的新属性。
发布于 2011-01-24 09:08:56
TypeDescriptor类返回PropertyDescriptor对象,这些对象表示obj类型中的属性,以及为对象本身或其类型贡献的任何其他属性。
组件模型实际上非常复杂,但正如您所描述的,TypeDescriptor.GetProperties()的基本实现将返回ReflectPropertyDescriptor实例,这些实例表示对典型PropertyInfo对象的间接。您可以像使用PropertyDescriptor对象一样使用PropertyInfo对象:它们可以用于获取和设置属性值,并且它们具有属性。
对于WPF中的DependencyObject实例,TypeDescriptor.GetProperties()还返回附加属性。在本例中,这些PropertyDescriptor对象为依赖对象模型提供了一个间接性,而不是反射。
在组件设计器中,可以使用ICustomTypeDescriptor或TypeDescriptionProviderAttribute (以及其他一些技术)在运行时或设计时创建您自己的PropertyDescriptor对象。在任何情况下,根据上下文的不同,从Type.GetProperties()返回的属性很可能与从TypeDescriptor返回的属性非常不同。
https://stackoverflow.com/questions/1402239
复制相似问题