类型参数“ T”必须为类类型

时间:2020-04-16 22:21:29

标签: 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?

1 个答案:

答案 0 :(得分:7)

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

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

这些约束通知编译器要求T / TObj是具有无参数Create()构造函数的类类型,这使得{ {1}}来创建传递给JsonToObject() / T的类型的新对象实例。