gpt4 book ai didi

delphi - 如何将 TObject 转换为 TObjectList

转载 作者:行者123 更新时间:2023-12-03 15:23:21 33 4
gpt4 key购买 nike

我有一个程序需要插入 TObject 的数组进入一个列表。该列表可以是任何受支持的类型,例如TObjectList , TObjectList<T> , TROArray

程序如下:

type
TObjectArray = Array of TObject;

...

procedure TMyClass.DoAssignObjectList(const ObjectArray: TObjectArray;
const DstList: TObject);
var
i: Integer;
begin
if DstList is TObjectList then
begin
for i := 0 to pred(TObjectList(DstList).Count) do
TObjectList(DstList).Add(ObjectArray[i]);
end else
if DstList is TObjectList<T> then // Obviously this doesn't work
begin
for i := 0 to pred(TObjectList<T>(DstList).Count) do
TObjectList<T>(DstList).Add(ObjectArray[i]);
end
else
begin
raise Exception.CreateFmt(StrNoDoAssignORMObject, [DstList.ClassName]);
end;
end;

如何检查对象是否为 TObjectList<T>然后将数组的元素添加到其中?

最佳答案

您必须使用一点 RTTI 来获取有关泛型类型的更多信息。

以下代码使用 Spring4D,它有一些方法:

uses 
...
Spring.Reflection;

procedure DoAssignObjectList(const ObjectArray: TObjectArray;
const DstList: TObject);

function IsGenericTObjectList(const obj: TObject): Boolean;
var
t: TRttiType;
begin
t := TType.GetType(obj.ClassInfo);
Result := t.IsGenericType and (t.GetGenericTypeDefinition = 'TObjectList<>');
end;

begin
...
if IsGenericTObjectList(DstList) then
begin
for i := 0 to pred(TObjectList<TObject>(DstList).Count) do
TObjectList<TObject>(DstList).Add(ObjectArray[i]);
...
end;

除此之外,您还可以获取有关列表的泛型参数类型的信息,以检查您放入其中的对象是否符合要求(当然仅适用于泛型类型):

function GetGenericTObjectListParameter(const obj: TObject): TClass;
var
t: TRttiType;
begin
t := TType.GetType(obj.ClassInfo);
Result := t.GetGenericArguments[0].AsInstance.MetaclassType;
end;

关于delphi - 如何将 TObject 转换为 TObjectList<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28814277/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com