Как использовать SuperObject для вызова методов, которые используют объект в качестве параметра в Delphi?
Мы можем использовать библиотеку SuperObject, чтобы вызывать методы определенного объекта по его имени и задавать его параметры в виде строки json, используя метод SOInvoker, как в этом ответе.
Я хотел бы знать, как я могу отправить созданный объект в качестве параметра. Я пытался отправить его как
LObjectList := TObjectList.Create;
LSuperRttiCtx := TSuperRttiContext.Create;
LSuperObjectParameter := LObjectList.ToJson(LSuperRttiCtx);
SOInvoke(MyInstantiatedObject, 'MyMethod', LSuperObjectParameter);
но внутри MyMethod ссылка LObjectList потеряна.
Что я делаю неправильно?
Библиотеку суперобъектов можно скачать здесь
1 ответ
Это будет работать, если вы используете массив записей из списка объектов. Если вы все еще хотите использовать список объектов, вам придется писать кодеры и декодеры, как это. Я написал кодировщик / декодер для TObjectList, вы должны будете сделать то же самое для ваших объектов и где-то внедрить имя класса.
ctx.SerialToJson.Add(TypeInfo(TObjectList), ObjectListToJSON);
ctx.SerialFromJson.Add(TypeInfo(TObjectList), JSONToObjectList);
function ObjectListToJSON(ctx: TSuperRttiContext; var value: TValue;
const index: ISuperObject): ISuperObject;
var
list: TObjectList;
i: Integer;
begin
list := TObjectList(value.AsObject);
if list <> nil then
begin
Result := TSuperObject.Create(stArray);
for i := 0 to list.Count - 1 do
Result.AsArray.Add(encodeyourobject(list[i]));
end else
Result := nil;
end;
function JSONToObjectList(ctx: TSuperRttiContext; const obj: ISuperObject; var Value: TValue): Boolean;
var
list: TObjectList;
i: Integer;
begin
list := nil;
case ObjectGetType(obj) of
stNull:
begin
Value := nil;
Result := True;
end;
stArray:
begin
list := TObjectList.Create;
for i := 0 to obj.AsArray.Length - 1 do
list.Add(decodeyourobject(obj.AsArray[i]));
Value := list;
Result := True;
end;
else
result := False;
end;
end;