3
我工作的自定义类,以XML转换和要求之一是流TObjectList<T>
领域的能力得到对象。
我试图调用ToArray()
方法来获取TObjectlist的对象保持,但我得到“无效的类类型转换”,因为该类型的明显不匹配。德尔福RTTI:如何从TObjectList <T>
借此类,例如:
type
TSite = class
Name : String;
Address : String;
end;
TSites = class
Sites : TObjecList<TSite>;
end;
我只需要得到网站从网站TObjectList对象。 请记住,我使用RTTI,所以我不知道对象类型中TObjectList,所以铸字都不行。这是我有,但它似乎是一个死胡同(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方法
编辑
感谢David我有我的解决方案:
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;
我开放的建议,也许还有更“聪明”的方式来实现这一目标?
为什么你需要把项目中的数组?你能否不只是调用'GetItem'而是逐一读取每个项目?您可以将结果存储在“TObject”中,而不必知道“T”。 –
@RobKennedy,由于某些原因,我在迭代typeinfo.GetMethods()时找不到方法。 – whosrdaddy