德尔福Rtti : how to get objects from TObjectList<T>

标签 delphi generics delphi-xe rtti tobjectlist

我正在开发一个自定义类到 xml 转换器,要求之一是能够流式传输 TObjectList<T>字段。
我试图调用 ToArray()方法来获取 TObjectlist 的对象,但我得到“无效的类类型转换”,因为类型显然不匹配。

以这个类为例:

type
  TSite = class
    Name : String;
    Address : String; 
  end;

  TSites = class
    Sites : TObjecList<TSite>;
  end;  

我只需要从站点 TObjectList 获取站点对象。 请记住,我正在使用 RTTI,因此我不知道 TObjectList 中的 ObjectType,因此类型转换将不起作用。这就是我所拥有的,但它似乎是一个死胡同(Obj 是 TobjectList<TSite> 这里):

function TXmlPersister.ObjectListToXml(Obj : TObject; Indent: String): String;

var
  TypInfo: TRttiType;
  meth: TRttiMethod;
  Arr  : TArray<TObject>;

begin
 Result := '';
 TypInfo := ctx.GetType(Obj.ClassInfo);
 Meth := TypInfo.GetMethod('ToArray');
 if Assigned(Meth) then
  begin
   Arr := Invoke(Obj, []).AsType<TArray<TObject>>; // invalid class typecast error

   if Length(Arr) > 0 then
    begin
     // get objects from array and stream them
     ...
    end;
  end;

任何通过 RTTI 从 TObjectList 中获取对象的方法对我来说都是有好处的。 由于某些奇怪的原因,我在 TypInfo 中没有看到 GetItem/SetItem 方法

编辑

感谢大卫,我有了解决方案:

function TXmlPersister.ObjectListToXml(Obj : TObject; Indent: String): String;

var
  TypInfo: TRttiType;
  meth: TRttiMethod;
  Value: TValue;
  Count : Integer;

begin
 Result := '';
 TypInfo := ctx.GetType(Obj.ClassInfo);
 Meth := TypInfo.GetMethod('ToArray');
 if Assigned(Meth) then
  begin
   Value := Meth.Invoke(Obj, []);
   Assert(Value.IsArray);
   Count :=  Value.GetArrayLength;
   while Count > 0 do
    begin
     Dec(Count);
     Result := Result + ObjectToXml(Value.GetArrayElement(Count).AsObject, Indent);
    end;
  end;
end;

我愿意接受建议,也许有更多“聪明”的方法来实现这个目标......

最佳答案

您的代码失败,因为动态数组不是 TObject。

你可以这样做:

Value := Meth.Invoke(Obj, []);
Assert(Value.IsArray);
SetLength(Arr, Value.GetArrayLength);
for i := 0 to Length(Arr)-1 do
  Arr[i] := Value.GetArrayElement(i).AsObject;

关于德尔福Rtti : how to get objects from TObjectList<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497843/

相关文章:

delphi - Delphi 7 中的病毒

delphi - 我的包裹单位到底在哪里?

java - 类的泛型类型参数可以从其构造函数的参数推断出来吗?

java - 使用泛型使用变量中的类实例化Java匿名内部类

delphi - delphi中有这个VB代码的相关语法吗?

delphi - System.Math.MomentSkewKurtosis 中的 Moment 3 和 Moment 4 到底是什么

c - Delphi 记录和 C 结构

C# 将当前泛型类实例传递给其他类

xml - 我如何使用 TXMLDocument 将版本和编码添加到 xml 文件

Delphi XE TBytes正确用法