【问题标题】:Returning an ObjectList from RTTI in delphi在delphi中从RTTI返回一个ObjectList
【发布时间】:2018-02-08 16:40:54
【问题描述】:

我在一个对象内调用方法,我试图在我做它的方式上保持非常动态,我遇到了一个问题,我的返回类型是一些对象的列表,我考虑过使用 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;

【问题讨论】:

    标签: delphi rtti delphi-10.1-berlin


    【解决方案1】:

    返回:

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

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

    【讨论】:

      【解决方案2】:

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

      如果您实际上有TObjectList&lt;TObject&gt;,那么应该通过。如果你有一些 TObjectList&lt;T&gt; 其中 T 是其他一些类,你需要像这样进行硬广播:

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

      这样做基本上是在伪造协方差。但是请记住,因为您可以将对象添加到返回的TObjectList&lt;TObject&gt;,所以您将失去关于它真正具有的元素类型的类型安全性,并且列表本身不会检查这一点。 (见my article about co- and contravariance)。

      【讨论】:

      • 感谢您的信息。
      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 2012-09-22
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2020-05-01
      • 2013-06-19
      相关资源
      最近更新 更多