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
.