如何获得通用集合所拥有的类?

时间:2013-12-13 11:24:38

标签: delphi generics

我有一个清单

type
  TMyList = class(TList<TMyClass>);

我想从此列表的过程中获取此列表所包含的类的ClassName,在本例中为TMyClass。我可以使用属性,但我想避免这种解决方案。

1 个答案:

答案 0 :(得分:3)

我不认为你可以用股票TList<T>轻松地做到这一点。您可以扩展TList<T>以公开元素的类,如下所示:

type
  TMyList<T: class> = class(TList<T>)
  private
    class function GetElementType: TClass; static;
  public
    class property ElementType: TClass read GetElementType;
  end;

class function TMyList<T>.GetElementType: TClass;
begin
  Result := T;
end;

这会强制您的列表包含类。如果你想更通用,并且只涵盖类别以外的类型列表,那么我认为你需要深入研究RTTI。实际上,RTTI将为您提供一种在不修改类的情况下获取元素类的方法。例如:

{$APPTYPE CONSOLE}

uses
  Generics.Collections, System.Rtti;

type
  TMyObject = class
  end;

var
  ctx: TRttiContext;
  ListType: TRttiInstanceType;
  Method: TRttiMethod;
  ReturnType: TRttiType;

begin
  ListType := ctx.GetType(TypeInfo(TList<TMyObject>)) as TRttiInstanceType;
  Method := ListType.GetMethod('First');
  ReturnType := Method.ReturnType;
  Writeln(ReturnType.ToString);
  Readln;
end.