【发布时间】:2010-04-01 08:26:02
【问题描述】:
基于对较早post 的一个回答,我正在调查以下设计的可能性
TChildClass = class(TObject)
private
FField1: string;
FField2: string;
end;
TMyClass = class(TObject)
private
FField1: TChildClass;
FField2: TObjectList<TChildClass>;
end;
现在,在现实世界中,TMyClass 将有 10 个这样的不同列表,所以我希望能够使用 RTTI 来处理这些列表。但是,我对这个类的其他字段不感兴趣,所以我需要检查某个字段是否是某种 TObjectList。这是我到目前为止所得到的:
procedure InitializeClass(RContext: TRttiContext; AObject: TObject);
var
ROwnerType: TRttiType;
RObjListType: TRttiType;
RField: TRttiField;
SchInf: TSchemaInfoDetail;
begin
ROwnerType := RContext.GetType(AObject.ClassInfo);
RObjListType := RContext.GetType(TObjectList<TObject>);
for RField in ROwnerType.GetFields do begin
// How do I check if the type of TMyClass.FField2 (which is TObjectList<TChildClass>) is some sort of TObjectList?
end;
很明显,RField.FieldType <> RObjListType.FieldType。但是,他们确实有一些关系,不是吗?为了使RField.FieldType很可能实际上是TObjectList而对通用功能进行非常精细的检查似乎很可怕(而且是错误的!)。
说实话,我对泛型感到很不舒服,所以这个问题可能很幼稚。但是,我很乐意学习。上述解决方案是否可以实施?蒂亚!
【问题讨论】:
-
谢谢梅森。我猜,将其标记为 2010 年的问题有点矫枉过正。
标签: delphi generics delphi-2010 rtti