Sur la base d'une réponse à une précédente post, j'étudie la possibilité de la conception suivanteDelphi: RTTI et TObjectList <TObject>
TChildClass = class(TObject)
private
FField1: string;
FField2: string;
end;
TMyClass = class(TObject)
private
FField1: TChildClass;
FField2: TObjectList<TChildClass>;
end;
Maintenant, dans le monde réel, TMyClass aura 10 différentes listes comme celle-ci , donc je voudrais pouvoir traiter ces listes en utilisant RTTI. Cependant, je ne suis pas intéressé par les autres champs de cette classe, donc je dois vérifier si un certain champ est une sorte de TObjectList. Voilà ce que j'ai jusqu'à présent:
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;
De toute évidence, RField.FieldType <> RObjListType.FieldType
. Cependant, ils ont une certaine relation, n'est-ce pas? Il semble horrible (et faux!) De faire un chèque très élaboré pour les fonctionnalités communes afin de rendre hautement probable que RField.FieldType
est en fait un TObjectList
.
Pour être honnête, je suis tout à fait mal à l'aise avec les génériques, la question pourrait être très naïve. Cependant, je suis plus qu'heureux d'apprendre. La solution ci-dessus est-elle possible à mettre en œuvre? TIA!
Merci Mason. MARQUAGE cela comme un 2010-problème a été un peu exagéré, je suppose. – conciliator