Pregunta

Considere 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 personalizadas TypeDescriptor , donde como Type.GetProperties () solo devolverá intrínseco " real " Propiedades del objeto. ¿Es esto correcto? Si obj no tiene ninguna propiedad personalizada TypeDescriptor , entonces por defecto solo devuelve las propiedades intrínsecas literales del objeto.


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

  

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

¿Fue útil?

Solución

obj.GetType (). GetProperties () no devuelve un PropertyDescriptorCollection , devuelve un System.Reflection.PropertyInfo [] . La clase PropertyInfo , como usted sugiere, representa solo las propiedades reales creadas en el objeto. Un PropertyDescriptor es un hijo 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.

Entonces, para una clase que no define un descriptor personalizado, funcionalmente recuperarás los mismos objetos, aunque el PropertyDescriptor está abstrayendo el PropertyInfo .

Otros consejos

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 por una nueva propiedad que tiene una IU de tiempo de diseño más rica.

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

El modelo de componente es bastante complejo, pero como lo describe, la implementación básica de TypeDescriptor.GetProperties () devolverá ReflectPropertyDescriptor que representan una indirección a objetos típicos de PropertyInfo . Puede usar los objetos PropertyDescriptor de manera 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 quizás algunas otras técnicas) para crear sus propios objetos PropertyDescriptor en tiempo de ejecución o en tiempo de diseño. En cualquier caso, es posible que las propiedades devueltas de Type.GetProperties () puedan diferir mucho de las devueltas de TypeDescriptor , dependiendo del contexto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top