delphi – 如何将TObject转换为TObjectList?
发布时间:2020-12-15 09:21:12 所属栏目:大数据 来源:网络整理
导读:我有一个过程需要将一个TObject数组插入到列表中.该列表可以是任何支持的类型,例如TObjectList,TObjectList T,TROArray等 该过程如下所示: type TObjectArray = Array of TObject;...procedure TMyClass.DoAssignObjectList(const ObjectArray: TObjectArra
我有一个过程需要将一个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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |