TypeDescriptor.GetProperties () vs Type.GetProperties ()
-
05-07-2019 - |
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 ();
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.