delphi - 类型参数 'T' 必须是类类型

标签 delphi

我正在为 REST 操作编写一个小型帮助程序类。我的主要目标之一是使用泛型提供从 JSON 中的正文响应到特定对象的自动转换。

这是辅助类中函数之一的外观:

function RESTServiceCallHelper.ExecuteAsObject<TObj>(resource: string): TObj;
var
 RestRequest: TRESTRequest;
 obj: TObj;
begin
  PrepareRequest(RestRequest, resource);
  RestRequest.Execute;
  obj := TJson.JsonToObject<TObj>(RestRequest.Response.Content);
  result:=obj;
end;

这是我尝试使用它的方式:

类型

   TPartnerCreditInfo   = class
      FlCreditClassDesc: string;
      FCppID: string;
      FCreditClass: string;
      FCreditClassDesc: string;
      FCreditLimit_CurrencyCode: string;
      FCreditLimit: double;
      FAmountBalance: double;
      FAmountBalance_CurrencyCode: string;
      FAmountBalanceLast: double;
      FAmountBalanceLast_CurrencyCode: string;
   end;

procedure TModuleX.CallAPIS;
var
  lRESTHelper : TrpRESTServiceCallHelper;
  pc: TPartnerCreditInfo;
begin
  lRESTHelper:= TrpRESTServiceCallHelper.Create('https://mydomain/api');
  lRESTHelper.AddQueryStringParam('param1','paramvalue');

  pc:=lRESTHelper.ExecuteAsObject<TPartnerCreditInfo>('resource');
  showmessage(pc.FCppID);
end;

我在编译时面临的问题是:

obj := TJson.JsonToObject<TObj>(RestRequest.Response.Content);
[dcc32 Error] RESTServiceCallObj.pas(99): E2511 Type parameter 'T' must be a class type

根据文档,JsonToObject 函数的 T 参数必须是一个类,并且 TPartnerCreditInfo 也是一个类。为什么 TPartnerCreditInfo 无法被识别?

最佳答案

TJson.JsonToObject()T 通用参数已标记为 class and constructor constraints 。因此,您的 ExecuteAsObject() 函数的 TObj 通用参数需要使用相同的约束进行标记:

function ExecuteAsObject<TObj: class, constructor>(resource: string): TObj;

这些约束通知编译器T/TObj必须是具有无参数Create()的类类型 构造函数,它允许 JsonToObject() 创建传递给 T/TObj 类型的新对象实例。

关于delphi - 类型参数 'T' 必须是类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61261028/

相关文章:

Delphi - 可以indy TIdTCPClient同时发送/接收大流

delphi - SHGetFolderPath 对我不起作用

delphi - 访问泛型类型的成员

delphi - 为什么此资源指令显示在可用表单列表中?

delphi - 将 DBgrid 导出为 CSV?

android - 套接字错误 110 : Connection Timed Out - Android Delphi SMTP Gmail

delphi - FireMonkey 是否有第三方组件目录?

delphi - 如何向 Delphi Docking 示例添加持久性

c# - COM 服务器发送空字符串,该字符串被转换为 NULL 指针

delphi - 在 Canvas 上绘制旋转位图