2009-06-04 20 views
2

背景Delphi Prismにシーラス・アクセスおよび機能

この質問は、Delphi Prismのでアスペクト指向プログラミングのための新しいCirrusインフラに関連する検索結果を設定します。

私は現在、クラスにオートインジェクションし、aMethod.SetBody機能を使用してターゲットコードを修正しようとしています。これまでのところ、Cirrus Introduction documentation wikiにあるLoggingサンプルコードを基に、自分のコードを構造化しました。私は、元の関数の本体が実行されてとなしの両方に注入された関数の結果にアクセスするにはどうすればよい

質問

1つのコードパスでOriginalBodyへの呼び出しをバイパスし、もう1つのコードパスとしてOriginalBodyを呼び出し、そのAspectコードでOriginalBodyの後続の結果を使用する関数の結果を設定したいと考えています。 私はもともとこれがAspects.RequireResultメソッドの意図された目的かもしれないと思っていましたが、私のケースではOriginalBodyの実行を強制し、コードの重複を引き起こしていました。

答えて

2

これはどういう意味ですか?

オリジナルの方法: -

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

新しい方法: - 私は内の文字列を使用しようとすると、そのための

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

メソッドレベルの側面は、この

[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

ようになります。 Datavalue(ターゲット関数は文字列を返します)内部エラーが発生します。文字列を使用している場合、このコードを更新する必要がありますか? – jamiei

+0

SomeMethodが文字列を返し、新しいDataValueのパラメータも文字列であればOKです。 – Mosh

+0

AssignmentStatementを引用符で囲まずに文字列を置き換えると、(Data7)内部エラー(D03)が発生します。 – jamiei

関連する問題