TObjectList<T>
RTTI を使用して任意の Delphi オブジェクトをストリーミングするための汎用コードを実装しています。これを機能させるには (より具体的には、読み込み部分を機能させるために)、フィールドのサブアイテム タイプを取得する必要があります。実際のオブジェクト インスタンスを使用せずに。
実際のオブジェクト インスタンスを使用しないという要件の明白な理由は、ストリームからオブジェクトをロードする場合 (ロードされるオブジェクトのクラス タイプの知識のみに基づいて)、インスタンスがないことです。ロードが完了する前にすべて利用可能です。むしろ、問題のクラスの純粋な RTTI データにのみアクセスできます。
ロードできるようにしたいクラスの例は次のとおりです。
TTestClass = class(TObject)
public
test_list : TList<string>;
end;
私が望むのは、test_list
フィールドが一般的なTList<T>
場所であると結論付けられることT
ですstring
(つまり、サブアイテムのストリームから期待されるデータを知るため)。
クラスが代わりに次のようになった場合:
TTestClassWithArr = class(TObject)
public
test_arr : array of string;
end;
フィールドのRTTI クラスのElementType()
メソッドを使用して、純粋に RTTI を介してこの情報を抽出できますが、対応するそのような明示的な RTTI タイプが見つかりません。TRttiDynamicArrayType
test_arr
TObjectList<T>
別のスタック オーバーフローの質問 ( Delphi Rtti: how to get objects fromTObjectList<T>
) は関連していますが、実際には、RTTI データが反映するオブジェクトの実際のインスタンスを使用して、サブアイテムに到達するために「チート」します。これらのサブアイテムは、私がこれを知っている必要がある時点では存在しないため、私にはオプションではありません.
ただし、オブジェクトのインスタンス化に関係なく、コンパイル時にすべての型情報が明らかに存在するため、クラスの RTTI 情報のみを使用してこれを行う方法があるはずです。