基于一个答案到一个较早的post,我调查了以下设计的可能性,现在德尔福:RTTI和TObjectList <TObject>
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
。
说实话,我对泛型非常不舒服,所以这个问题可能很幼稚。不过,我非常乐意学习。上述解决方案是否可能实施? TIA!
谢谢梅森。我认为将此标记为2010年的问题有点矫枉过正。 – conciliator 2010-04-01 19:15:37