TypeDescriptor.GetProperties () vs Type.GetProperties ()
-
05-07-2019 - |
Domanda
Considera il seguente codice.
Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT*
Sto cercando di capire la differenza tra A e B. Da quello che ho capito TypeDescriptor.GetProperties () restituirà proprietà TypeDescriptor personalizzate, dove Type.GetProperties () restituirà solo "reale" intrinseco proprietà dell'oggetto. È giusto? Se obj non ha proprietà TypeDescriptor personalizzate, per impostazione predefinita restituisce anche le proprietà intrinseche letterali dell'oggetto.
* Originale seconda riga di codice prima di EDIT (con valore di ritorno errato):
PropertyDescriptorCollection B = obj.GetType (). GetProperties ();
Soluzione
obj.GetType (). GetProperties ()
non restituisce un PropertyDescriptorCollection
, restituisce un System.Reflection.PropertyInfo []
. La classe PropertyInfo
, come suggerisci, rappresenta solo le proprietà effettive create sull'oggetto. Un PropertyDescriptor
è un figlio concreto personalizzato della classe PropertyDescriptor
(implementato dal tipo che definisce il descrittore personalizzato) oppure è un'istanza della classe interna sigillata ReflectPropertyDescriptor
che utilizza la classe PropertyInfo
per fornire l'invocazione dinamica della proprietà.
Quindi per una classe che non definisce un descrittore personalizzato, otterrai gli stessi oggetti in modo funzionale, sebbene il PropertyDescriptor
stia sottraendo il PropertyInfo
.
Altri suggerimenti
La classe TypeDescriptor
viene utilizzata nei designer, in modo che possano interagire con l'ambiente in fase di progettazione. In particolare, i progettisti possono sovrascrivere ed estendere varie funzioni di TypeDescriptor
, ma non Type
.
Un buon esempio sta lavorando con i controlli associati ai dati. La proprietà DataSource
è di tipo System.Object
, eppure in fase di progettazione, quella proprietà viene sostituita con una nuova proprietà con un'interfaccia utente in fase di progettazione più ricca.
La classe TypeDescriptor
restituisce gli oggetti PropertyDescriptor
che rappresentano le proprietà nel tipo di obj
e qualsiasi altra proprietà che è stata apportata al oggetto stesso o al suo tipo.
Il modello del componente è in realtà piuttosto complesso, ma come descrivi, l'implementazione di base di TypeDescriptor.GetProperties ()
restituirà ReflectPropertyDescriptor
che rappresentano un riferimento indiretto ai tipici oggetti PropertyInfo
. Puoi usare gli oggetti PropertyDescriptor
come gli oggetti PropertyInfo
: possono essere usati per ottenere e impostare il valore della proprietà e hanno degli attributi.
Per le istanze DependencyObject
in WPF, TypeDescriptor.GetProperties ()
restituisce anche le proprietà associate. Questi oggetti PropertyDescriptor
in questo caso forniscono un riferimento indiretto al modello a oggetti di dipendenza piuttosto che alla riflessione.
Nel componente designer, è possibile utilizzare ICustomTypeDescriptor
o TypeDescriptionProviderAttribute
(e forse alcune altre tecniche) per creare oggetti PropertyDescriptor
personalizzati in fase di esecuzione o in fase di progettazione. In ogni caso, è possibile che le proprietà restituite da Type.GetProperties ()
possano benissimo differire da quelle restituite da TypeDescriptor
, a seconda del contesto.