2009-06-04 24 views
2

ContexteDelphi Prism Cirrus accès et la configuration du résultat d'une fonction

Cette question a trait à la nouvelle infrastructure Cirrus pour la programmation orientée aspect dans Delphi Prism.

J'ai actuellement un aspect que je suis Auto-Injectant dans une classe et je tente de modifier le code cible en utilisant la fonction aMethod.SetBody. J'ai structuré mon code jusqu'ici en utilisant le code d'exemple de journalisation trouvé sur le wiki de documentation Cirrus Introduction comme base.

Question

Comment puis-je accéder au résultat de la fonction étant injectée dans, avec et sans le corps de la fonction d'origine en cours d'exécution? Je voudrais être en mesure de définir le résultat de la fonction en contournant l'appel à OriginalBody dans un chemin de code et en tant que l'autre chemin de code pour appeler le OriginalBody et utiliser le résultat suivant du OriginalBody dans mon code Aspect. Je pensais à l'origine que cela pourrait être l'objectif de la méthode Aspects.RequireResult, mais cela semble forcer l'exécution de l'OriginalBody dans mon cas, entraînant une duplication de code.

Répondre

2

Voulez-vous dire quelque chose comme ça?

méthode originale: -

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

Nouvelle méthode: -

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

L'aspect niveau de la méthode pour cela ressemblerait à ceci

[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

Si je tente d'utiliser une chaîne dans le Datavalue (la fonction cible renvoie une chaîne) Je reçois une erreur interne. Est-ce que ce code doit être mis à jour si j'utilise une chaîne? – jamiei

+0

Tant que SomeMethod renvoie une chaîne et que le paramètre dans la nouvelle DataValue est également une chaîne, cela devrait fonctionner. – Mosh

+0

Je reçois (CE7) erreur interne (D03) dans RemObjects.Oxygene.targets lorsque je remplace par une chaîne lors de la suppression de l'AssignmentStatement, que fait exactement DataValue()? – jamiei