【发布时间】:2012-04-01 01:25:27
【问题描述】:
将方法作为参数传递不是问题:
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;
但这是一种 hack 且不安全 - 编译器无法检查方法的参数。
问题:是否可以以类型安全的方式做同样的事情?
【问题讨论】:
-
只是出于兴趣,为什么要这样做?第一个代码示例中的直接方法看起来要简单得多。
-
我希望我的标题编辑能更清楚地表明你没有做初学者会做的事情,这是一个非常深刻的 hack。
-
@Johan - 摆脱大量重复代码
标签: delphi methods arguments type-safety