代码之家  ›  专栏  ›  技术社区  ›  Miguel Febres

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

  •  0
  • Miguel Febres  · 技术社区  · 5 年前

    以下是其中一个函数在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;
    

       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
    

    根据文档,jsontobject函数的T参数必须是一个类,tpartnercredinfo也是一个类。为什么tpartnercredinfo没有被识别?

    1 回复  |  直到 5 年前
        1
  •  7
  •   Remy Lebeau    5 年前

    T 的泛型参数 TJson.JsonToObject() class and constructor constraints . 因此 TObj 的泛型参数 ExecuteAsObject()

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

    这些约束告诉编译器 T / 必修的 成为一个没有参数的类类型 Create() JsonToObject() / 托比 .