gpt4 book ai didi

Delphi:RTTI 和 TObjectList

转载 作者:行者123 更新时间:2023-12-03 15:22:45 27 4
gpt4 key购买 nike

基于之前的一个答案 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 .

说实话,我对泛型很不舒服,所以这个问题可能很天真。然而,我非常乐意学习。上述解决方案是否可以实现? TIA!

最佳答案

每个通用实例化都是唯一的,并且与 RTTI 方面的其他实例化没有关系。因为 Delphi 无法在运行时实例化泛型类型,所以没有等价物,例如.NET GetGenericTypeDefinition 。您能做的最好的事情就是查看字体的形状 - 例如它是否实现了GetEnumerator , Add等等

这也可以足够灵活来处理一般集合类型,而不仅仅是从 TObjectList<T> 实例化的集合类型。 。 C# 对其集合初始值设定项执行类似的操作 - 它查找 Add方法并插入对其的调用:

http://msdn.microsoft.com/en-us/library/bb384062.aspx

关于Delphi:RTTI 和 TObjectList<TObject>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2559049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com