加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读