2011-12-08 64 views
12

我需要獲取表單類型的列表,但僅限於從給定的基本表單派生的類型。如何獲得從給定類派生的類的列表,增強了RTTI?

我用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; 

我不想實例化一個對象,並用「是」操作,因爲它不會執行及時。
作爲當前的解決方法,我測試一個方法,在TMyBaseForm介紹,在RTTI情況下被發現:

if (rtyp.GetMethod('MyMethod') = nil) then Continue; 

但這不是一個乾淨的解決方案,因爲它可以,如果導致問題與方法同一個名字在另一個班級分支中引入。

所以,我的問題:是否有一種常規方法來檢測類類型是否從另一個類類型派生?

感謝,

+2

我不知道如何使用RTTI實現它,但有[ClassParent](http://docwiki.embarcadero.com/VCL/en/System.TObject.ClassParent)函數。它返回一個類的直接祖先的類型。或者,如果您需要查明特定的類類型或對象是否是某個類的實例或其某個子類的實例,請使用[InheritsFrom](http://docwiki.embarcadero.com/VCL/en/System.TObject.InheritsFrom)功能。 – TLama

回答

13

當你調用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; 
+3

OMG,剛剛從TClass錯過了這個方法......我想,只是糟糕的一天或需要咖啡時間。感謝您的回答 – user315561

+2

+1 @ user315561咖啡始終有效! (: – ComputerSaysNo

+1

「AsInstance」爲+1 –

相關問題