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

Mig*_*res 2 delphi

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

这是其中一个函数在 helper 类中的样子:

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;
Run Code Online (Sandbox Code Playgroud)

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

类型

   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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rem*_*eau 7

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

function ExecuteAsObject<TObj: class, constructor>(resource: string): TObj;
Run Code Online (Sandbox Code Playgroud)

这些限制告知编译T/TObj要求是具有无参数的类类型Create()的构造,这是允许JsonToObject()创建传递给类型的新对象实例T/ TObj