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 ();

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top