2010-05-01 23 views
5

Nehmen wir an, es gibt eine Klasse mit einer virtuellen Eigenschaft (nennen wir es 'P'). Es wird in einer abgeleiteten Klasse überschrieben. Jetzt möchte ich etwas wie dieses verwenden: obj.GetType().GetProperty("P"), um Informationen über die überschreibende Eigenschaft zu erhalten. Diese Suche ist zweideutig, da es zwei "P" -Eigenschaften (Basis und Überschreibung) gibt. Also tippte ich: obj.GetType().GetProperty("P", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)Reflektierende abgeleitete Klassen in C#

Es gibt nur das überschreibende "P" zurück, aber was ist, wenn ich in der Kompilierzeit nicht erraten kann, wenn es überhaupt eine Überschreibung gibt? Letzterer Aufruf würde null zurückgeben. Der Fall ist noch komplizierter, wenn die Hierarchie der Vererbung größer ist.

Mit anderen Worten, ich möchte die "oberste" Überschreibung verfügbar, sonst - die Basis-Eigenschaft. Was ist der sauberste Weg, um das Ziel zu erreichen? Ich weiß im Moment nur, dass ich alle Eigenschaften durchgehen und den Namen und den Typ prüfen muss.

Antwort

3

Grundsätzlich stimme ich Martin: BindingFlags.FlattenHierarchy ist wahrscheinlich, was Sie brauchen. Aber ich denke, diese sind statt von BindingFlags.DeclaredOnly verwendet werden, das heißt

Type type = obj.GetType(); 
var c = type.GetProperty("P", BindingFlags.FlattenHierarchy | 
           BindingFlags.Public | 
           BindingFlags.Instance); 

können Sie dann c.DeclaringType verwenden, bei der, um herauszufinden Ebene Eigentum erklärt wurde.

Wenn Sie DeclaredOnly angeben und die Art type auch keine Aussage (aber erben) P, null zurückgegeben.

+0

Ja, das war es, was ich brauchte, um die Dinge funktionieren zu lassen. Die von Ihnen angegebene Beispielverwendung entspricht genau der Vorgehensweise. Vielen Dank! – pbalaga

1

Haben Sie versucht, BindingFlags.FlattenHierarchy hinzuzufügen?

+0

Danke, das ist was ich brauche. Die Beschreibung von flattenHierarchy auf msdn schien für mich irreführend, also habe ich das nicht berücksichtigt. Es sagt über geschützte statische Mitglieder, die ich nicht übereinstimmen möchte. Jetzt, nachdem ich einen schnellen Test vorbereitet habe, kann ich BindingFlags.Static | BindingFlags.NonPublic muss trotzdem (zusätzlich) angegeben werden, um mit geschützten statischen Elementen wirksam zu werden. Danke, dass Sie auf Dinge hingewiesen haben, die offensichtlich sein sollten. – pbalaga

Verwandte Themen