如何在Delphi中使用SuperObject调用使用对象作为参数的方法?

9
我们可以使用SuperObject库,通过SOInvoker方法,根据对象的名称并给出其参数的json字符串来调用某个对象的方法,就像在这个答案中所示。
我想知道如何将创建的对象作为参数发送。我尝试像这样发送它:
LObjectList := TObjectList.Create;
LSuperRttiCtx := TSuperRttiContext.Create;
LSuperObjectParameter := LObjectList.ToJson(LSuperRttiCtx);

SOInvoke(MyInstantiatedObject, 'MyMethod', LSuperObjectParameter);

但是在MyMethod中,LObjectList引用丢失了。

我做错了什么?

可以在这里下载superobject库(点击链接)


LObjectList 引用存储为 MyMethod 的私有类字段或局部变量怎么样?我知道这是一个解决方法,但我现在无法检查那里发生了什么。 - TLama
@TLama - 这并不能解决我的问题。我想发送许多种对象,因为我正在实现一个通用的动态方法调用器。但是感谢您的评论,到目前为止您是唯一一个回复我的人。 - Haruki
1个回答

8
如果您使用记录数组而不是对象列表,则可以正常工作。 如果仍想使用对象列表,则需要编写像这样的编码器和解码器。我已经为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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接