2011-12-08 9 views
12

フォームタイプのリストを取得する必要がありますが、特定の基本フォームから派生したタイプのものだけを取得する必要があります。拡張RTTIを使用して、特定のクラスから派生したクラスのリストを取得するにはどうすればよいですか?

私は私の現在のコードがある

をデルファイ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が最終的にあなたが

InheritsFrom関数を呼び出すことができますはTClassを使用して、そこからあなたが MetaclassTypeプロパティウィッヒは、反射型へ TClass参照ですアクセスしなければならない、 TRttiInstanceTypeを返す呼び出します
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コーヒーは常に動作します! (:Aslustanceの場合は – ComputerSaysNo

+1

+1 –

関連する問題