我正在为旧的Delphi XE代码库编写一些实用程序代码;为了使事情更简单和更安全,我创建了一种方法,该方法旨在包装通过参数传递的特定于类型的TProc<TReq>
(其中TReq
是泛型类类型)在更广泛的{{1} },之后应将其与TProc<TObject>
和其他字符串参数一起馈给第三方组件:
TClass(TReq)
先前的方法可以成功编译,并且如果这样调用,则可以按预期工作(尽管将type
TREvoHostConnectionOptions = record
// [...]
procedure OnPush<TReq:class>(const pushMethod: string; const action: TProc<TReq>);
end;
// [...]
procedure TREvoHostConnectionOptions.OnPush<TReq>(const pushMethod: string; const action: TProc<TReq>);
var
rec: TRPushHandler;
begin
rec.PushMethod := pushMethod;
rec.PushModel := TClass(TReq);
rec.Handler :=
procedure(reqRawModel: TObject)
var
reqModel: TReq;
begin
// Conversione modello richiesta
reqModel := reqRawModel as TReq;
if Assigned(reqRawModel) and not Assigned(reqModel) then
raise EEvoHostException.Create(Format('Impossibile convertire il modello di tipo %s in %s.',[reqRawModel.Classname,TClass(TReq).Classname]));
// Azione
if Assigned(action) then
action(reqModel);
end;
PushHandlers.Add(rec);
end;
作为通用类型会破坏该方法的目的)
TObject
但是,如果我在测试表单单元中使用特制的模型类来调用它:
opts.OnPush<TObject>('Test',procedure (reqModel: TObject) begin (* ... *) end);
我在调用单元的完全不相关的行(以及完全不同且完全不相关的方法)中收到以下编译器错误:
[DCC错误] WndMain.pas(96):E2010不兼容的类型:“ TTestModel”和“ TObject”
*如果我在同一文件中的其他任何地方引入了人工语法错误,则会在正确的行报告该位移,仅在出现此特定错误时才会发生位移。
有什么想法吗?这是编译器错误吗?如果可以,有什么办法可以解决它?不幸的是,我无法删除方法上的 type
TTestModel = class(TObject)
strict private
_a,_b: string;
public
property A: string read _a write _a;
property B: string read _b write _b;
end;
约束,因为否则,方法内发生的:class
转换会(在逻辑上)引发另一个有关TClass(TReq)
不受约束的类或接口的编译错误类型。