Параметр типа 'T' должен быть типом класса - PullRequest
2 голосов
/ 17 апреля 2020

Я пишу небольшой вспомогательный класс для операций REST. Одна из моих основных целей - обеспечить автоматическое приведение c из ответа тела в JSON к указанному c объекту с использованием обобщенных типов.

Вот так выглядит одна из функций в классе помощника:

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;

И вот как я пытаюсь его использовать:

type

   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

Согласно документации, параметр T для функции JsonToObject должен быть классом, а TPartnerCreditInfo также является классом. Почему TPartnerCreditInfo не распознается?

1 Ответ

7 голосов
/ 17 апреля 2020

Параметр T Generi c TJson.JsonToObject() помечен ограничениями class и constructor . Таким образом, параметр TObj Generi c вашей функции ExecuteAsObject() должен быть помечен с такими же ограничениями:

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

Эти ограничения сообщают компилятору, что T / TObj требуется , чтобы быть типом класса с конструктором Create() без параметров, что позволяет JsonToObject() создавать новый экземпляр объекта типа, переданного в T / TObj.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...