在delphi中从RTTI返回ObjectList

在delphi中从RTTI返回ObjectList,delphi,rtti,delphi-10.1-berlin,Delphi,Rtti,Delphi 10.1 Berlin,我在一个对象内调用方法,我试图以我这样做的方式保持非常动态,我遇到了一个问题,我的返回类型是一些对象的列表,我考虑过使用TObjectList。现在的问题是rtti返回一个TValue,我不完全理解如何将其转换为TObjectList。我认为将TValue转换为TObject,因为理论上TObject列表是一个对象,但它不起作用。你们知道我怎样才能做到这一点吗 这就是我要说的功能 function TMyClass.ExecMethodAndRet(MethodName: string;

我在一个对象内调用方法,我试图以我这样做的方式保持非常动态,我遇到了一个问题,我的返回类型是一些对象的列表,我考虑过使用TObjectList。现在的问题是rtti返回一个TValue,我不完全理解如何将其转换为TObjectList。我认为将TValue转换为TObject,因为理论上TObject列表是一个对象,但它不起作用。你们知道我怎样才能做到这一点吗

这就是我要说的功能

   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;
返回:

Result := M.Invoke(Self, Args).AsType<TObjectList<TObject>>;
请注意,不要忘记初始化返回值,最好在函数体的开头。

您需要使用正确的参数调用TValue上的aType。看

如果您实际上有一个TObjectList,那么应该传递它。如果您有一些TObjectList,其中T是其他类,则需要执行如下硬广播:

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

通过这样做,你基本上伪造了协方差。但是,请记住,由于可以将对象添加到返回的TObjectList中,因此对于它真正具有的元素类型,您将失去类型安全性,而列表本身不会检查这一点。请参阅。

谢谢您提供的信息。