2008-11-19 6 views

Antwort

30

Nein - es gibt mehr. Mit ComponentModel können Sie einige Dinge vom DLR-Typ ausführen, z. B. Laufzeiteigenschaften. So stellt ein DataView Spalten einem Raster zur Verfügung - sie sind keine Reflexionseigenschaften - sie sind Laufzeiteigenschaften. Die Schlüsselwörter hier sind ICustomTypeDescriptor und TypeDescriptionProvider.

Dieses Modell ermöglicht auch Abstraktion und Indirektion. Zum Beispiel, wenn Sie eine Menge Reflektion über Eigenschaften machen, betrachten Sie HyperDescriptor - das ist ein Dienstprogramm, das ich schrieb, das eine benutzerdefinierte PropertyDescriptor Implementierung verwendet, um das Reflexionsmodell für ein vorkompiliertes Modell zu tauschen, für enorme Leistungssteigerungen.

In Bezug auf die Verwendung gibt es einige andere Unterschiede; ComponentModel unterstützt nur eine einzelne Instanz eines beliebigen Attributs auf einem Member (im Gegensatz zur Reflektion, bei der mehrere gleichartige Attribute zulässig sind). Und es ist datenzentriert - also existieren Eigenschaften, ebenso wie Ereignisse (die hauptsächlich für Änderungsbenachrichtigungen gedacht sind) - aber es gibt keine Felder oder Methoden.

Es hat auch gute Unterstützung für i18n - da der DisplayName usw. kann im laufenden Betrieb angepasst werden.

ComponentModel ist jedoch nicht (direkt) kompatibel mit Dingen wie LINQ (MemberExpression im Besonderen) - da dies an Reflektionsdaten binden will. Das ComponentModel wird schließlich in der IDE durch Dinge wie PropertyGrid (wie Dinge wie die zusätzlichen Eigenschaften für QuickInfos funktionieren) sehr gut verwendet, aber ebenso fast alle UI-Daten werden über ComponentModel (da dies das Binden ermöglicht) ausgeführt Unterstütze DataTable, Klassen und alles andere, was dir einfällt.

+0

Ich weiß, das ist älter als die Hügel, aber könnten Sie einige der Dinge erklären, die Sie in LINQ machen können und können, wenn Sie System.ComponentModel für die Reflektion verwenden? – wootscootinboogie

+0

@woot das ist eine kurze Antwort: LINQ kümmert sich nicht um ComponentModel –