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