Передача кода метода в качестве аргумента типобезопасным способом

Передача метода в качестве аргумента не проблема:

type
  TSomething = class
    Msg: string;
    procedure Show;
  end;

procedure TSomething.Show;
begin
  ShowMessage(Msg);
end;

type TProc = procedure of object;

procedure Test(Proc: TProc);
begin
  Proc;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Smth: TSomething;

begin
  Smth:= TSomething.Create;
  Smth.Msg:= 'Hello';
  Test(Smth.Show);
end;

Мне нужно кое-что хитрое - передать только кодовую часть метода. Я знаю, что могу это сделать:

procedure Test2(Code: Pointer);
var
  Smth: TSomething;
  Meth: TMethod;

begin
  Smth:= TSomething.Create;
  Smth.Msg:= 'Hello Hack';
  Meth.Data:= Smth;
  Meth.Code:= Code;
  TProc(Meth);
  Smth.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Test2(@TSomething.Show);
end;

, но это хак и небезопасно - компилятор не может проверить аргументы метода.

Вопрос: Можно ли сделать то же самое безопасным способом?

5
задан kludg 15 March 2012 в 14:44
поделиться