2010-02-11 8 views
6

Wenn mehrere Attribute auf ein Element angewendet werden, z.Hat die Reihenfolge der Attribute irgendwelche Garantien?

[Foo] 
[Bar] 
void Baz() { ... } 

sind dann alle durch die CLR/.NET Spezifikation Garantien in Bezug auf welcher Reihenfolge werden sie durch Reflexion in wenn sie abgerufen werden abgerufen werden (z Attribute.GetCustomAttributes)? Die Dokumentation für diese Methoden macht sie nicht explizit, und obwohl es so aussieht, als ob sie in der Reihenfolge zurückgegeben werden, in der sie angewendet werden, möchte ich mich nicht auf undokumentiertes Verhalten verlassen, da dies nur nach Ärger fragt.

Warum dies wichtig sein könnte, stellen Sie sich vor, dass die Attribute verwendet werden, um anzuzeigen, dass die Methode eine Reihe von Interzeptoren haben sollte, die in einer bestimmten Reihenfolge ausgeführt werden sollten.

Antwort

11

Nein von 17.2 Attribute specification scheint es nicht so.

Die Reihenfolge, in der in einer solchen Liste angegebenen Attribute, und die Reihenfolge, in der Abschnitte das gleiche Programm Einheit befestigt angeordnet sind, ist nicht signifikant. Zum Beispiel sind die Attributspezifikationen [A] [B], [B] [A], [A, B] und [B, A] gleich .

+0

Scheint ziemlich schlüssig - danke. Ich habe erwartet, dass ich ehrlich bin. –

3

Es ist generell eine schlechte Idee, sich auf solche Dinge zu verlassen. Wenn die Reihenfolge wichtig ist, würde ich dem Attribut eine Priorität-Eigenschaft geben, so dass es sehr explizit gemacht werden kann.

Ich kenne keine Garantien, dass sie in der ursprünglichen Reihenfolge abgerufen werden.

+0

Ja, ich stimme zu. Ich hatte ihnen eine "AspectOrder" -Eigenschaft gegeben, um das zu kontrollieren, aber ich war nur fasziniert, ob es notwendig war, die Bestellung im Gegensatz zur Absicht zu garantieren. –

1

imo Attribute sollten keine Reihenfolge haben, da es sich nicht um Flusskontrollkonstrukte handelt.

Ich denke, Sie könnten dem Attribut eine Prioritätseigenschaft hinzufügen und diese verwenden, um die Ausführungsreihenfolge zu bestimmen?

+1

Gargh - von Skeet geschlagen, warum störe ich? ;) – RSlaughter

Verwandte Themen