2009-06-04 12 views
2

HintergrundDelphi Prism Cirrus den Zugriff und die Einstellung das Ergebnis einer Funktion

Diese Frage bezieht sich auf die neue Cirrus Infrastruktur für Aspect Oriented Programming in Delphi Prism.

Ich habe derzeit einen Aspekt, der ich Auto-Injecting in eine Klasse bin und versuche, den Zielcode mit aMethod.SetBody Funktion zu ändern. Ich habe meinen Code bisher mit dem Logging-Beispielcode strukturiert, der im Dokumentations-Wiki Cirrus Introduction als Grundlage zu finden ist.

Frage

Wie kann ich das Ergebnis der Funktion Zugang in injiziert werden, sowohl mit als auch ohne die ursprüngliche Funktion Körper ausgeführt wird?

Ich möchte in der Lage sein, das Ergebnis der Funktion zu legen, die den Aufruf von OriginalBody in einem Codepfad und als den anderen Codepfad umwandelt, um den OriginalBody aufzurufen und das nachfolgende Ergebnis des OriginalBody in meinem Aspektcode zu verwenden. Ich dachte ursprünglich, dass dies der beabsichtigte Zweck der Aspects.RequireResult-Methode sein könnte, aber dies scheint die Ausführung des OriginalBody in meinem Fall zu erzwingen, was Code-Duplikation verursacht.

Antwort

2

Meinst du sowas?

Original-Methode: -

method Something.SomeMethod(a:Integer;b:Integer;c:Integer): Integer; 
begin 
    result:=b+c; 
end; 

Neue Methode: -

begin 
if (a > 0) then 
begin 
    result := (b + c); 
    exit 
    end; 
begin 
result := 1000; 
exit 
end 

Verfahren Ebene Aspekt dafür, wie dies

[AttributeUsage(AttributeTargets.Method)] 
    Class1Attribute = public class(System.Attribute, 
    IMethodImplementationDecorator) 
    private 
    protected 
    public 
    method HandleImplementation(Services: RemObjects.Oxygene.Cirrus.IServices; aMethod: RemObjects.Oxygene.Cirrus.IMethodDefinition); 
    end; 

implementation 

method Class1Attribute.HandleImplementation(Services: RemObjects.Oxygene.Cirrus.IServices; aMethod: RemObjects.Oxygene.Cirrus.IMethodDefinition); 
begin 

    var newVersion:=new ResultValue(); 

    var newAssignment:=new AssignmentStatement(newVersion,new DataValue(1001)); 

    var p1:= new ParamValue(0); 

    aMethod.SetBody(Services,method 
    begin 
     if (unquote<Integer>(p1)>0) then 
     begin 
     Aspects.OriginalBody; 
     end 
     else 
     begin 
     unquote(newAssignment); 
     end; 
    end); 

end; 
+0

aussehen würde, wenn ich versuche, eine Zeichenfolge zu verwenden, innerhalb der Datenwert (die Zielfunktion gibt eine Zeichenfolge zurück) Ich erhalte einen internen Fehler. Muss dieser Code aktualisiert werden, wenn ich eine Zeichenfolge verwende? – jamiei

+0

Solange SomeMethod eine Zeichenfolge zurückgibt und der Parameter im neuen DataValue auch eine Zeichenfolge ist, sollten Sie in Ordnung sein. – Mosh

+0

Ich bekomme (CE7) Interner Fehler (D03) in RemObjects.Oxygene.targets, wenn ich beim Aufheben der Zuweisung der Zuweisungsstatement durch eine Zeichenfolge ersetzen, was genau tut der DataValue()? – jamiei