Delphi Prism Cirrus доступ и настройка результата функции - PullRequest
2 голосов
/ 04 июня 2009

Фон

Этот вопрос относится к новой Cirrus инфраструктуре для аспектно-ориентированного программирования в Delphi Prism.

В настоящее время у меня есть аспект, который я автоматически внедряю в класс, и пытаюсь изменить целевой код с помощью функции aMethod.SetBody . До сих пор я структурировал свой код, используя пример кода Logging, который можно найти в вики Cirrus Введение документации в качестве основы.

Вопрос

Как получить доступ к Результату функции, в которую вводится, как с выполнением исходного тела функции, так и без него?

Я хотел бы иметь возможность установить результат функции, обходящей вызов OriginalBody в одном пути кода и в качестве другого пути кода, для вызова OriginalBody и использования последующего результата OriginalBody в моем коде Aspect. Первоначально я думал, что это может быть предназначением метода Aspect.RequireResult , но в моем случае это вызывает принудительное выполнение OriginalBody, вызывая дублирование кода.

1 Ответ

2 голосов
/ 05 июня 2009

Вы имеете в виду что-то подобное?

Оригинальный метод: -

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;
...