2009-08-19 4 views
4

Ich schreibe einen Bibliothekscode, und Klassen, die diesen Code verwenden, müssen zwei Attribute angeben (ein benutzerdefiniertes Attribut und eines aus .NET).Kann ein benutzerdefiniertes Attribut andere Attribute ohne Vererbung implizieren?

Es ist ein bisschen mühsam, diese Anforderung zu dokumentieren und diese beiden Attribute auf jede Klasse zu kopieren und einzufügen, die meine Bibliothek verwendet. Daher dachte ich, es wäre besser, wenn mein benutzerdefiniertes Attribut nur das Vorhandensein des andere. Dieses andere Attribut aus dem .NET Framework ist jedoch versiegelt, so dass ich es nicht einfach erben kann ...

Also gibt es eine Möglichkeit, dies zu tun? Kann ich vielleicht zur Laufzeit das .NET-Attribut hinzufügen?

Danke.

+0

Können Sie uns sagen, was das .Net-Attribut ist? –

+0

System.ServiceModel.XmlSerializerFormatAttribute –

Antwort

1

Während Sie können Vererbung in Attributen verwenden, ist es recommended you don't.

Da dies nur eine Leistungsregel ist, werden Sie die Korrektheit nicht verletzen, aber es kann Verwirrung stiften, und Sie müssen viel Mühe darauf verwenden, sicherzustellen, dass Sie nicht die Semantik des Basisattributs verletzen. Sie können Probleme verursachen, wenn Sie versuchen, die möglichen Positionen für das Attribut mit den AttributeUsage-Flags zu erweitern. Die Regeln für das betreffende Attribut lauten quite complex.

Eine Methode kann eines der beiden Attribute haben, aber nicht beide. Jede Operation, die nicht angewendet wurde, verwendet das Attribut, das auf die umschließende Klasse angewendet wurde. Wenn für die enthaltene Klasse kein Attribut angewendet wird, wird der DataContractSerializer verwendet.

Geben Sie dies versiegelt klingt wie ein vernünftiger Plan ihrerseits. Diese API wurde nicht für diese Art von Erweiterungen entwickelt.

Es gibt keine Möglichkeit (kurz AOP-Stil 'Code-Injektion'), Attribute zur Laufzeit vorhandenen Klassen hinzuzufügen.

+0

Das macht Sinn. Ich werde nur die Laufzeitprüfung beibehalten, um die Anforderung durchzusetzen. –

0

Ich glaube nicht, dass es eine Möglichkeit gibt, sekundäre Attribute zu implizieren oder Attribute zur Laufzeit hinzuzufügen. Sie können jedoch eine benutzerdefinierte Codevorlage verwenden, um die Attribute jeder Klasse beim Hinzufügen hinzuzufügen. Und/oder für Klassen, die bereits entwickelt wurden, vermute ich, dass Sie ein Makro schreiben könnten, das jede Datei durchläuft und die Attribute zu den Klassen hinzufügt, allerdings habe ich das in der Vergangenheit nicht gemacht, also bin ich mir nicht sicher, was es bedeuten würde Ich weiß, dass das Erstellen einer Codevorlage, die einer Klassendeklaration zu Attributen hinzugefügt wird, relativ einfach ist. Dies funktioniert jedoch nur für die Klasse, die Sie hinzufügen, ab dem Zeitpunkt des Hinzufügens der Vorlage. Wenn Sie auch alte Klassen bereinigen müssen, würde ich in Makros schauen, wenn Sie viele Dateien/Klassen haben, für die dies getan werden muss. Oder mache es manuell, wenn es nicht zu viele gibt.

Verwandte Themen