首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi: RTTI和TObjectList<TObject>

Delphi: RTTI和TObjectList<TObject>
EN

Stack Overflow用户
提问于 2010-04-01 16:26:02
回答 2查看 3.6K关注 0票数 4

基于对早期post的一个回答,我正在调查以下设计的可能性

代码语言:javascript
复制
TChildClass = class(TObject)
private
  FField1:  string;
  FField2:  string;
end;

TMyClass = class(TObject)
private
  FField1:  TChildClass;
  FField2:  TObjectList<TChildClass>;
end;

现在,在现实世界中,TMyClass将有10个不同的列表,所以我希望能够使用RTTI来处理这些列表。但是,我对这个类的其他字段不感兴趣,所以我需要检查某个字段是否是某种TObjectList。这是我到目前为止所得到的:

代码语言:javascript
复制
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的可能性很大。

老实说,我对泛型感到很不舒服,所以这个问题可能很天真。然而,我非常高兴能学到这些。上面的解决方案可以实现吗?蒂娅!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-01 18:18:59

每个泛型实例化都是唯一的,并且与RTTI方面的其他实例化没有关系。因为Delphi不能在运行时实例化泛型类型,所以没有等同于.NET的GetGenericTypeDefinition。你能做的最好的事情就是查看类型的形状--例如,它是否实现了GetEnumeratorAdd等。

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

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

票数 6
EN

Stack Overflow用户

发布于 2010-12-11 23:24:40

Delphi可以在运行时实例化泛型类型。问题是,泛型类型通常不包含在运行时信息中。如果您持有特定类型的全局变量(在本例中为TObjectList< TChildClass >),在初始化部分实例化(并释放)它,则该特定类的运行时信息将不会被链接器剥离,您将能够稍后动态实例化它。(您需要提供类的完全限定名,以便context.findType()正常工作。)我花了一些时间弄清楚如何才能做到这一点,我对此肯定不满意,但由于我还没有找到另一种方法,所以我现在必须处理它。如果有人知道更好的方法,请告诉我。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2559049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档