2016-07-25 19 views
0

Meine Frage befasst sich mit der Überprüfung der geerbten Eigenschaften von Eigenschaften.Attribut.IsDefined vs MemberInfo.IsDefined - Unterschied des geerbten Parameters

in this Question beschrieben wie die Methoden Attribute.IsDefined(MemberInfo, Type, Boolean)(1) undMemberInfo.IsDefined(Type, Boolean)(2) sind grundsätzlich die gleichen. Beide prüfen, ob ein Attribut verwendet wird. Aber es gibt einen gravierenden Unterschied beim Vererben Parameter, wenn ich eine Immobilie überprüfen möge:

(1):

Wenn dies zutrifft, gibt auch für benutzerdefinierte Attribute der Vorfahren des Elements zu suchen.

(2):

wahr Mitgliedervererbungskette zu suchen, um die Attribute zu finden; sonst falsch. Dieser Parameter wird für Eigenschaften und Ereignisse ignoriert; Siehe Bemerkungen.

(Die Ausführungen nur die Verwendung von (1) empfehlen)

Es ist kein Problem zu verwenden (1) eine ererbte Attribut einer Eigenschaft zu erhalten. Aber meine Frage ist die warum: Warum ist diese Funktion wie folgt implementiert? Was ist der Grund, die Nutzung oder der Nutzen? Von meinem Punkt gibt es eine Methode, die einen Parameter ignoriert und das ist nicht wirklich eine saubere Lösung.

Habe ich etwas übersehen?

Antwort

2

Meine Schätzung (und es ist ist nicht mehr eine Vermutung) - der Grund ist Rückwärtskompatibilität.

PropertyInfo.IsDefined und EventInfo.IsDefined ignoriert die inherit Parameter seit sie in .NET 1.0 eingeführt wurden. Die statischen Methoden unter Attribute wurden in .NET 2.0 eingeführt und wurden geändert, um die Vererbung von Eigenschaften und Ereignissen zu unterstützen. Wenn sie dieses Verhalten ändern sollten, könnte alter Code, der inherit auf True gesetzt hat, unerwartete Attribute erhalten.

Nur eine von vielen Inkonsistenzen in der BCL ... :)