我正在为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?
答案 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
的类型的新对象实例。