从delphi中的RTTI返回ObjectList

时间:2018-02-08 16:40:54

标签: delphi rtti delphi-10.1-berlin

我正在调用一个对象内部的方法,我正试图保持非常动态的方式,我正在做这个问题,我的问题是我的返回类型是一些对象的列表,我想到使用TObjectList现在的问题是rtti返回一个TValue,我不完全理解我如何将它转换为TObjectList。我认为将TValue转换为TObject,因为理论上TObjectList是一个对象,但它不起作用。你们知道我怎么可能实现这个目标吗?

这就是我所说的功能。

   function TMyClass.ExecMethodAndRet(MethodName: string;
      Args: array of TValue): TObjectList<TObject>;
    var
     R : TRttiContext;
     T : TRttiType;
     M : TRttiMethod;
    begin
      T := R.GetType(FMyObject.ClassInfo);
      for M in t.GetMethods do
        if (m.Parent = t) and (UpperCase(m.Name) = UpperCase(MethodName))then
        begin
          result := M.Invoke(FMyObject, Args); <- problem here can't cast to TObjectList
        end;
    end;

2 个答案:

答案 0 :(得分:2)

返回:

Result := M.Invoke(Self, Args).AsType<TObjectList<TObject>>;

P.S。不要忘记初始化返回值,理想情况是在函数体的开头。

答案 1 :(得分:2)

您需要使用正确的参数在AsType上致电TValue。 (见doc

如果你实际上有TObjectList<TObject>,那么这应该通过。如果你有一些TObjectList<T>,其中T是其他类,你需要像这样做硬编:

Result := TObjectList<TObject>(M.Invoke(FMyObject, Args).AsObject);

通过这样做你基本上伪造了协方差。但是请记住,因为您可以向返回的TObjectList<TObject>添加对象,所以您实际上失去了关于它实际具有哪种元素类型的类型安全性,并且列表本身不会检查它。 (见my article about co- and contravariance)。