Delphi:RTTI和TObjectList
发布时间:2020-12-15 09:22:09 所属栏目:大数据 来源:网络整理
导读:基于 post之前的一个答案,我正在研究以下设计的可能性 TChildClass = class(TObject)private FField1: string; FField2: string;end;TMyClass = class(TObject)private FField1: TChildClass; FField2: TObjectListTChildClass;end; 现在,在现实世界中,TMyCl
基于
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |