代码之家  ›  专栏  ›  技术社区  ›  John

在delphi中从RTTI返回ObjectList

  •  2
  • John  · 技术社区  · 7 年前

    我在一个对象内调用方法,我试图保持动态性,我遇到了一个问题,返回类型是一些对象的列表,我考虑使用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 回复  |  直到 7 年前
        1
  •  2
  •   Victoria zac    7 年前

    退货:

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

    P、 不要忘记初始化返回值,最好是在函数体的开头。

        2
  •  2
  •   Stefan Glienke    7 年前

    你需要打电话 AsType TValue 使用正确的参数。(参见 doc )

    如果你真的有 TObjectList<TObject> 那么这个应该通过。如果你有 TObjectList<T> 其中T是其他类,您需要进行如下硬铸件:

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

    这样做基本上就是伪造协方差。但是请记住,因为您可以将对象添加到返回的 目标列表(<TObject> 您正在失去关于它真正具有的元素类型的类型安全性,而列表本身没有检查这一点。(参见 my article about co- and contravariance ).