Добрый день.
Затеял небывалое - кастинг процедур на дженерике.
Код:
unit Unit4;
interface
uses
Vcl.Forms, System.Classes, System.Generics.Collections;
type
TForm4 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
fNotifyEvent: TNotifyEvent;
function CastMethod<T>(P: Pointer): T;
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure DataModuleOnEvent(Sender: TObject);
begin
//
end;
{ TForm4 }
function TForm4.CastMethod<T>(P: Pointer): T;
var
M: TMethod;
begin
M.Data := nil;
M.Code := P;
Result := T(M);
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
fNotifyEvent := CastMethod<TNotifyEvent>(@DataModuleOnEvent);
end;
end.
Проблема в том, что при компиляции ругается на Invalid typecast в функции кастинга, в строке Result := T(M). Причем, если убрать оттуда дженерик и указывать приведение к тому же TNotifyEvent - то все хорошо:
function TForm4.CastMethod(P: Pointer): TNotifyEvent;
var
M: TMethod;
begin
M.Data := nil;
M.Code := P;
Result := TNotifyEvent(M);
end;
Вопрос: Что я делаю не так? Я, вообще, законными вещами занимаюсь?
Добавлено через 12 минут и 39 секунд:А, ну я понял... Если передаваемый тип будет не процедурным, то, действительно, получится лажа вида Result := String(M).
Тогда получается, вопрос звучит по-другому: как-то можно указать, что <T> должен быть именно процедурным? Попробовал заменить T на TProc = reference to procedure - то же самое...