In meiner Anwendung habe ich zuvor reguläre C # -Attribute verwendet, um eine Methode zu "kommentieren". Zum Beispiel:
%Vor%Was SpecialAttributeLogicHere () getan hat, war, alle Foo-Attribute nachzuschauen, die diese bestimmte Methode kommentiert haben. Es würde dann (für sich allein) ein eigenes Wörterbuch für alle Schlüssel und Werte erstellen.
Ich versuche jetzt, zu PostSharp zu wechseln, weil das SpecialAttributeLogic in OnEntry in einen Aspekt eingefügt werden kann (und aus dem Methodenrumpf entfernt werden kann, der viel sauberer ist!). Foo wird durch einen Aspekt ersetzt, der OnMethodBoundaryAspect erweitert.
Ich möchte es immer noch folgendermaßen verwenden:
%Vor%Aber wenn Foo einen OnEntry hat, bedeutet das, dass "SpecialAttributeLogic" zweimal ausgeführt wird. Ich muss im Grunde alle Schlüssel und Werte von jedem Foo () in einem Wörterbuch "sammeln", worauf ich etwas Logik anwende.
Wie geht das (oder Best Practices) mit PostSharp? Danke!
Es sieht so aus, als ob Sie innerhalb Ihrer Methode ein Namevaluepaar erstellen möchten. Sie können dies nicht mit einem Aspekt tun. Was ich vorschlage, ist, dass Sie ein MethodInterceptionAspect verwenden und die Attribute der Methode widerspiegeln, dann Ihre Sammlung erstellen und sie in der Methode über einen Parameter übergeben (eventuell überladene Methode) oder als Klassenmitglied festlegen.
Sie können die Werte zum Zeitpunkt der Kompilierung reflektieren, um die Leistung optimal zu halten.
Hier ist eine schnelle Lösung für Ihr Problem. Es ist ein bisschen hässlich (Sie müssen Anpassungen vornehmen, um zu passen). Es gibt andere Wege, aber sie sind nicht so "generisch".
%Vor%target und values werden beide bei compiletime (nicht runtime) für den Verbrauch zur Laufzeit initialisiert. Sie werden mit dem Aspekt bei compiletime serialisiert. Auf diese Weise sparen Sie den Reflektionshit zur Laufzeit.
Genau wie eine Anmerkung, endete ich mit MethodInterceptionAspect und nur OnInvoke überschreiben. In OnInvoke habe ich args.Method.GetCustomAttributes () betrachtet und mir alle System.Attributes gegeben, die ich gesetzt habe (d. H. SpecialAttribute in DustinDavis 'Beispiel).
Mit diesen Attributen und ihren Eigenschaften kann ich die Logik ausführen, die ich ausführen muss. Wenn die Logik erfolgreich ist, beende ich mit args.Proceed (), wenn nicht, werfe ich eine Ausnahme aus.