c# reflection types typedescriptor

c# - TypeDescriptor.GetProperties() vs Type.GetProperties()



reflection types (3)

La clase TypeDescriptor devuelve objetos PropertyDescriptor 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 en realidad es bastante complejo, pero como usted describe, la implementación básica de TypeDescriptor.GetProperties() devolverá ReflectPropertyDescriptor instancias de ReflectPropertyDescriptor que representan un indirecto a los objetos PropertyInfo típicos. Puede usar objetos PropertyDescriptor muy similar a los objetos PropertyInfo : se pueden usar para obtener y establecer el valor de la propiedad y tienen atributos.

Para las instancias de DependencyObject 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 usar ICustomTypeDescriptor o TypeDescriptionProviderAttribute (y tal vez algunas otras técnicas) para crear sus propios objetos PropertyDescriptor en tiempo de ejecución o en designtime. En cualquier caso, es posible que las propiedades devueltas desde Type.GetProperties() puedan diferir muy bien de las devueltas de TypeDescriptor , según el contexto.

Considera el siguiente código.

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 () devolverá propiedades de TypeDescriptor personalizadas, mientras que Type.GetProperties () solo devolverá las propiedades "reales" intrínsecas del objeto. ¿Es esto correcto? Si obj no tiene propiedades de TypeDescriptor personalizadas, se predetermina a devolver también las propiedades intrínsecas del objeto.

* Original segunda línea de código antes de EDITAR (tenía un valor de retorno incorrecto):

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


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

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


obj.GetType().GetProperties() no devuelve un PropertyDescriptorCollection , sino que 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 PropertyDescriptor está abstrayendo el PropertyInfo .