【发布时间】:2014-02-10 12:20:03
【问题描述】:
我有一个TList<TForm> 类型的列表。我需要将其转换为TList<TObject>,如下所示:
procedure mainForm.testCast;
var
listT: TList<TForm>;
listW: TList<TObject>;
obj: TObject;
begin
listT := TList<TForm>.create;
listT.add(form1);
listT.add(form2);
listW := TList<TObject>(listT); // Casting is OK
// This works, but is this fine?
for obj in listW do
memo1.lines.add(obj.className);
end;
示例按预期工作,但可以在通用列表之间进行这样的转换吗?这会导致一些数据结构损坏等吗?
我仅将它用于循环 (DoGetEnumerator) 目的和一些字符串检查,即我不会添加/删除项目。
真正的功能稍微复杂一点。它使用TValue 中的RTTI 引用listT。
主要目标是不在我的单位链接FMX.Forms。
更新: Why are TGeneric<Base> and TGeneric<Descendant> incompatible types?
【问题讨论】:
-
这可以正常工作,但有点粗略。我怀疑无论如何你都需要在这里使用演员表。您可以通过 RTTI 联系到枚举器。
-
由于
TForm派生自TObject并且TList<TSomeThing>是类型化指针的通用列表,因此您的操作没有任何问题。也就是说,使用基类中的方法。 -
@LURD 我认为这是不对的。
TList<TObject>不是TList<TForm>的基类。您会发现TList<TForm> is TList<TObject>的计算结果为False。公共基础是TList<T>。另一种思考方式。如果它只是使用基类中的方法,为什么需要强制转换? -
@LURD 对不起,我在那条评论中弄错了代码。当然,
is在这里不好,因为它们都是类。我的意思是TList<TForm>.InheritsFrom(TList<TObject>) -
@DavidHeffernan,我主要指的是基类
TFormvsTObject。我希望TList<TForm>的行为方式与TList<TObject>相似,而对于任何TList<T>都不是这样。
标签: delphi casting rtti generic-collections tlist