Reflektion: Inkonsistentes Framework-Verhalten mit GetRuntimeProperty-Methoden

8

Beim Spielen mit Reflektion im neuen .NET Framework 4.5 stieß ich auf ein merkwürdiges Verhalten, das ich ziemlich unerwartet fand. Der Namespace System.Reflection bietet einige neue Erweiterungsmethoden zum Ausnutzen von Type-Objekten. Zwei davon sind GetRuntimeProperty (String-Name) und GetRuntimeProperties ().

Stellen Sie sich nun vor, Sie hätten ein einfaches Objekt mit einer internen Eigenschaft.

%Vor%

Und Sie versuchen jetzt, diesen Typ auszunutzen.

%Vor%

Wie erwartet, enthält das Objekt properties zwei Eigenschaftsdefinitionen für die Eigenschaftendefinitionen Id und Name, und nameProperty enthält die Namenseigenschaftsdefinition. Was nicht erwartet wurde, war das Objekt idProperty , das null sein sollte ...

Wenn ich von .NET Framework komme, denke ich, dass dies von Microsoft-Architekten beabsichtigt war, aber ich muss sagen, dass es nicht so aussieht, als würden Sie es erwarten. Ich glaube, dass sich ähnliche Methoden ähnlich verhalten sollten, aber GetRuntimeProperty scheint nach öffentlichen Eigenschaften zu filtern, bei denen GetRuntimeProperties keine Filter anwendet.

Hat jemand eine vernünftige Erklärung dafür, warum Microsoft entschieden hat, dass diese ähnlichen Methoden unterschiedliche Verhaltensweisen haben sollten? Ein Designfehler?

Danke.

    
Ucodia 22.12.2012, 15:04
quelle

1 Antwort

3

Intern% GetRuntimeProperty ruft Type.GetProperty(name) auf, das nach der öffentlichen Eigenschaft mit dem angegebenen Namen sucht. Die Eigenschaft Id ist geschützt, daher kann sie nicht gefunden werden.

%Vor%

Andererseits gibt GetRuntimeProperties sowohl öffentliche als auch nicht öffentliche Eigenschaften zurück

%Vor%

Erläuterung: GetRuntimeProperties purpose gibt IEnumerable<PropertyInfo> sammlung aller Eigenschaften zurück und wird beibehalten Sie filtern diese Sammlung über LINQ . Sie können öffentliche, nicht öffentliche oder andere Arten von Eigenschaften auswählen. Bei einer einzelnen Eigenschaft, die von GetRuntimeProperty zurückgegeben wird, ist diese Flexibilität nicht erforderlich. Daher ist sie für die gebräuchlichste Verwendung eingeschränkt.

    
Sergey Berezovskiy 22.12.2012 15:16
quelle

Tags und Links