Как использовать SuperObject для вызова методов, которые используют объект в качестве параметра в Delphi? - PullRequest
9 голосов
/ 21 октября 2011

Мы можем использовать библиотеку SuperObject для вызова методов определенного объекта по его имени и предоставления его параметров в виде строки json с использованием метода SOInvoker, как в этом ответе

Я хотел бы знать, как отправить созданный объект в качестве параметра. Я пытался отправить его как

LObjectList := TObjectList.Create;
LSuperRttiCtx := TSuperRttiContext.Create;
LSuperObjectParameter := LObjectList.ToJson(LSuperRttiCtx);

SOInvoke(MyInstantiatedObject, 'MyMethod', LSuperObjectParameter);

но внутри MyMethod ссылка LObjectList потеряна.

Что я делаю не так?

Библиотека суперобъектов может быть загружена здесь

1 Ответ

8 голосов
/ 06 января 2012

Это будет работать, если вы используете массив записей из списка объектов.Если вы все еще хотите использовать список объектов, вам придется писать кодеры и декодеры, как это.Я написал кодировщик / декодер для 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...