我有一个清单
type
TMyList = class(TList<TMyClass>);
我想从此列表的过程中获取此列表所包含的类的ClassName,在本例中为TMyClass
。我可以使用属性,但我想避免这种解决方案。
答案 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.