con*_*tor 4 delphi generics rtti delphi-2010
根据之前一篇文章的一个答案,我正在研究以下设计的可能性
TChildClass = class(TObject)
private
FField1: string;
FField2: string;
end;
TMyClass = class(TObject)
private
FField1: TChildClass;
FField2: TObjectList<TChildClass>;
end;
Run Code Online (Sandbox Code Playgroud)
现在,在现实世界中,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;
Run Code Online (Sandbox Code Playgroud)
显然,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
| 归档时间: |
|
| 查看次数: |
3427 次 |
| 最近记录: |