Bin gerade durch
diesen Blog Eintrag auf TVirtualMethodInterceptor aus der
Rtti.pas aufmerksam geworden. Endlich!!! Delphi kann nun AOP (wenn auch eingeschränkt und nicht komplett bugfrei)
Beispiel:
Delphi-Quellcode:
type
TFoo = class
public
procedure Bar; virtual;
end;
procedure InterceptorBefore(Instance: TObject; Method: TRttiMethod;
const Args: TArray<TValue>; out DoInvoke: Boolean; out Result: TValue);
begin
ShowMessage('Before: ' + Instance.ClassName + '.' + Method.Name);
end;
procedure InterceptorAfter(Instance: TObject; Method: TRttiMethod;
const Args: TArray<TValue>; var Result: TValue);
begin
ShowMessage('After: ' + Instance.ClassName + '.' + Method.Name);
end;
{ TFoo }
procedure TFoo.Bar;
begin
ShowMessage('TFoo.Bar');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
interceptor: TVirtualMethodInterceptor;
foo: TFoo;
begin
foo := TFoo.Create;
interceptor := TVirtualMethodInterceptor.Create(TFoo);
interceptor.Proxify(foo);
interceptor.OnBefore := InterceptorBefore;
interceptor.OnAfter := InterceptorAfter;
foo.Bar;
end;
Klasse Sache das (hab mich schon ne Weile mit AOP in Delphi und den Möglichkeiten beschäftigt). Ist leider nur ein experimenteller Status soweit ich das bei nem ersten Test sehen konnte, weil beim freigeben des Objekts noch
AV oder andere Exceptions geworfen werden (liegt wohl daran, dass ausnahmslos alle virtuellen Methoden intercepted werden, was nicht so gesund ist)
Aber immerhin das erste Feature in Delphi XE, was mich begeistert.