Frage

Betrachten Sie den folgenden Code ein.

Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT*

Ich versuche, den Unterschied zwischen A und B. Von zu verstehen, was ich verstehe, TypeDescriptor.GetProperties () wird wieder benutzerdefinierte TypeDescriptor Eigenschaften, wo als Type.GetProperties () wird nur das Rück intrinsische „echte“ Eigenschaften des Objekts. Ist das richtig? Wenn obj keine benutzerdefiniertes hat TypeDescriptor Eigenschaften dann wird standardmäßig nur, um auch die wörtlichen intrinsischen Eigenschaften des Objekts zurück.


* Original zweite Codezeile vor EDIT (hatte falschen Rückgabewert):

  

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

War es hilfreich?

Lösung

obj.GetType().GetProperties() gibt keinen PropertyDescriptorCollection, eine System.Reflection.PropertyInfo[] zurückgibt. Die PropertyInfo Klasse der Fall ist, wie Sie vorschlagen, repräsentieren nur die tatsächlichen Eigenschaften für das Objekt erstellt. A PropertyDescriptor ist entweder ein individueller Beton Kind der PropertyDescriptor Klasse (durch die Typdeskriptor Definieren der benutzerdefinierten implementiert ist), oder ist ein Beispiel der internen Klasse ReflectPropertyDescriptor abgedichtet, die die PropertyInfo Klasse verwenden dynamischen Aufruf der Eigenschaft bereitzustellen.

Also für eine Klasse, die keinen benutzerdefinierten Deskriptor nicht definiert, werden Sie funktionell die gleichen Objekte zurück, obwohl die PropertyDescriptor abstrahiert die PropertyInfo entfernt.

Andere Tipps

Die TypeDescriptor Klasse wird in Designer verwendet, so dass sie mit der Entwurfszeitumgebung interagieren können. Insbesondere können die Designer außer Kraft setzen und verschiedene Merkmale TypeDescriptor, aber nicht Type verlängern.

Ein gutes Beispiel ist die Arbeit mit datengebundenen Steuer. Die DataSource Eigenschaft ist vom Typ System.Object, noch zur Entwurfszeit, wird diese Eigenschaft durch eine neue Eigenschaft ersetzt, die eine reichere Entwurfszeit UI hat.

Die TypeDescriptor Klasse kehrt PropertyDescriptor Objekte, die die Eigenschaften in der Art der obj sowie alle anderen Eigenschaften dar, die auf das Objekt eingebracht wurden selbst oder auf seine Art.

Das Komponentenmodell ist eigentlich recht komplex, aber wie Sie beschreiben, wird die grundlegende Implementierung von TypeDescriptor.GetProperties() zurückkehren ReflectPropertyDescriptor Instanzen, die eine Umleitung zu typischen PropertyInfo Objekte darstellen. Sie können PropertyDescriptor Objekte sehr ähnlich wie PropertyInfo Objekte verwenden: sie verwendet werden können, zu erhalten und den Wert der Eigenschaft festgelegt und sie haben Attribute.

Für DependencyObject Instanzen in WPF, TypeDescriptor.GetProperties() gibt auch angefügten Eigenschaften. Diese PropertyDescriptor Objekte in diesem Fall bieten eine Indirektion der Abhängigkeit Objektmodell und nicht auf Reflexion.

In der Komponente Designer ist es möglich, ICustomTypeDescriptor oder TypeDescriptionProviderAttribute (und vielleicht einige andere Techniken) zu verwenden, um Ihre eigenen PropertyDescriptor Objekte zur Laufzeit erstellen oder zur Designzeit. In jedem Fall ist es möglich, dass die Eigenschaften von Type.GetProperties() zurück sehr gut von denen aus TypeDescriptor zurück abweichen kann, je nach Kontext.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top