我需要获取表单类型的列表,但只能从给定的基础表单派生类型.
我使用Delphi 2010和增强型RTTI浏览类型
我当前的代码是:
rc := TRTTIContext.Create; rtyps := rc.GetTypes; for rtyp in rtyps do begin if not(rtyp.IsInstance) then Continue; // Now I need to check if rtyp.AsInstance.MetaclassType is derived from TMyBaseForm end;
我不想实现一个对象,并使用’is’操作符,因为它不会及时执行.
作为当前的解决方法,我测试在RTTI上下文中是否找到了在TMyBaseForm中引入的方法:
if (rtyp.GetMethod('MyMethod') = nil) then Continue;
但是这不是一个干净的解决方案,因为如果在另一个类分支中引入了具有相同名称的方法,则可能会导致问题.
所以我的问题是:有没有定期的方式来检测类类型是否从另一个类类型派生?
谢谢,
解决方法
当你调用AsInstance返回一个
TRttiInstanceType,从那里你必须访问
MetaclassType
属性,它是一个
TClass引用反射类型,最后使用TClass你可以调用
InheritsFrom
函数
for rtyp in rtyps do if (rtyp.TypeKind=tkClass) and rtyp.IsInstance and rtyp.AsInstance.MetaclassType.InheritsFrom(TMyBaseForm) then begin // do something end;