SuperObject ライブラリには、オブジェクトをシリアル化するための一般的なメソッドがあります。
type
TSomeObject = class
...
end;
var
lJSON : ISuperObject;
lContext : TSuperRttiContext;
lSomeObject : TSomeObject;
begin
lSomeObject := TSomeObject.Create;
lContext := TSuperRttiContext.Create;
lJSON := lContext.AsJson<TSomeObject>(lSomeObject);
しかし今、私はメタクラスのインスタンスを扱っています。
これはオブジェクト構造です:
TJSONStructure = class(TObject);
TReqBase = class(TJSONStructure)
private
token: Int64;
public
end;
TReqLogin = class(TReqBase)
private
username,
password: String;
module : Integer;
public
end;
type
TWebAct = (ttlogin,
ttsignin);
TReqClass = class of TReqBase;
const
cWebActStructures: Array[TWebAct] of
record
RequestClass : TReqClass;
end
= (
{ ttlogin } (RequestClass: TReqLogin;),
{ ttsignin } (RequestClass: TReqSignIn;) // Not in definitions above
);
私が今試してみると:
var
lContext : TSuperRttiContext;
lJSON : ISuperObject;
lRequestClass : TReqClass;
lRequestBase : TReqBase;
begin
lRequestClass := cWebActStructures[ttlogin].RequestClass;
lRequestBase := lRequestClass.Create; // instance of type TReqLogin
lContext := TSuperRttiContext.Create;
lJSON := lContext.AsJson<TReqBase>(lRequestBase);
TReqBase をシリアル化します: TReqLoginlJSON.AsString = '{"token":-12346789}'
をシリアル化したいです。
試した:
lContext.AsJson< TReqLogin >(lRequestBase); 動作しません: 互換性のないタイプ) [さらに、ルーチンで可能なすべての RequestClass タイプをリスト/処理する必要があります]
lContext.AsJson< lRequestBase.ClassType >(lRequestBase) どちらでもない: E2531 メソッド 'AsJson' には明示的な型引数が必要です
lRequestBase を TReqLogin、TReq としてシリアル化する方法はありますか? それらすべてをコーディングする必要はありませんか?