2009-09-09 5 views
26

Tenga en cuenta el siguiente código.TypeDescriptor.GetProperties() vs Type.GetProperties()

Object obj; 
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj); 
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT* 

Estoy tratando de entender la diferencia entre A y B. Por lo que entiendo TypeDescriptor.GetProperties() volverá a medida TypeDescriptor propiedades, donde como Type.GetProperties() sólo se devolver las propiedades "reales" intrínsecas del objeto. ¿Es esto correcto? Si obj no tiene propiedades TypeDescriptor personalizadas, entonces también devuelve por defecto las propiedades intrínsecas del objeto. .


* original segundo línea de código antes de EDIT (valor de retorno tenía mal):

PropertyDescriptorCollection B = (obj.GetType) GetProperties();

Respuesta

18

obj.GetType().GetProperties() no devuelve un PropertyDescriptorCollection, devuelve un System.Reflection.PropertyInfo[]. La clase PropertyInfo, como sugiere, representa solo las propiedades reales creadas en el objeto. Un PropertyDescriptor es un elemento concreto personalizado de la clase PropertyDescriptor (implementado por el tipo que define el descriptor personalizado) o es una instancia de la clase interna sellada ReflectPropertyDescriptor que utiliza la clase PropertyInfo para proporcionar una invocación dinámica de la propiedad.

Por lo tanto, para una clase que no define un descriptor personalizado, volverá a obtener funcionalmente los mismos objetos, aunque el PropertyDescriptor está abstrayendo el PropertyInfo.

9

La clase TypeDescriptor se utiliza en los diseñadores, por lo que pueden interactuar con el entorno de tiempo de diseño. En particular, los diseñadores pueden anular y ampliar varias características de TypeDescriptor, pero no de Type.

Un buen ejemplo es trabajar con controles enlazados a datos. La propiedad DataSource es del tipo System.Object, pero en el momento del diseño, esa propiedad se reemplaza por una nueva propiedad que tiene una interfaz de usuario de tiempo de diseño más rica.

+0

Se usa en diseñadores, pero también se utiliza para el enlace de datos, por lo que no es solo una tecnología de tiempo de diseño. –

7

La clase TypeDescriptor devuelve PropertyDescriptor objetos que representan las propiedades en el tipo de obj, así como cualquier otra propiedad que se haya contribuido al objeto en sí o a su tipo.

El modelo de componentes es realmente bastante complejo, pero como usted describe, la implementación básica de TypeDescriptor.GetProperties() devolverá instancias ReflectPropertyDescriptor que representan un indirecto a los objetos típicos PropertyInfo. Puede usar objetos PropertyDescriptor de forma muy similar a los objetos PropertyInfo: se pueden usar para obtener y establecer el valor de la propiedad y tienen atributos.

Para DependencyObject instancias en WPF, TypeDescriptor.GetProperties() también devuelve propiedades adjuntas. Estos objetos PropertyDescriptor en este caso proporcionan una indirección al modelo de objetos de dependencia en lugar de a la reflexión.

En el diseñador de componentes, es posible el uso de ICustomTypeDescriptor o TypeDescriptionProviderAttribute (y tal vez algunas otras técnicas) para crear sus propios PropertyDescriptor objetos en tiempo de ejecución o en tiempo de diseño. En cualquier caso, es posible que las propiedades devueltas desde Type.GetProperties() puedan diferir muy bien de las devueltas desde TypeDescriptor, dependiendo del contexto.

Cuestiones relacionadas