RTTI:って異なりますのタイプによります。
-
13-09-2019 - |
質問
与えられた文字列を含むタイプの名前は一部の取得は、適切なタイプです。
私は見ていて思ったこと。
type
TSomeType<T> = class
// yadda yadda
end;
procedure DoSomething;
var
obj : TObject;
begin
o := TSomeType<GetTypeByName('integer')>.Create;
// do stuff with obj
end;
また複数のRTTI説明をオンラインで見通しのポ台などもやってみたいです。可能ですか?
解決
いいえ、ジェネリック医薬品は完全にコンパイルされます。
他のヒント
デルファイ2010の新しいRTTIユニットはユニットのインターフェース部で宣言されたタイプを検索する方法を有しています。 TRttiType
インスタンスによって表される任意のタイプのために、TRttiType.QualifiedName
プロパティタイプを取得するために、後でTRttiContext.FindType
と共に使用することができる名前を返します。修飾名は、続いて(それらが存在する場合、名前空間を含む)完全なユニット名である「」、完全なタイプ名が続く。
だから、あなたはTRttiType
で(context.FindType('System.Integer')
の形で)整数型の表現を取得することができます。
しかし、このメカニズムは、コンパイル時にインスタンス化されていなかったジェネリック型のインスタンスを取得するために使用することはできません。実行時にインスタンス化は、ランタイム・コードの生成を必要とします。
にいつでも登録種類かのレジストリにおけるデータベース文字列のリストや辞書)の作成工数を返却します適切なオブジェクトです。残念ながらように事前にお知らうまたとなりました。のようなものは、Delphi機能RegisterClass、FindClass(クラス単位)。私の考えでは、汎用のテンプレート型のリスト。
例の使用量:
RegisterCustomType('Integer',TSomeType<Integer>);
RegisterCustomType('String',TSomeType<String>);
if FindCustomType('Integer') <> nil then
O := FindCustomType('Integer').Create;
編集: ここでは特定の単純な実装を使用tDictionaryからジェネリック医薬品.コレクションの保存レジストリ...ょっと休暇を抽出すことを最大限に活用できる方法として、コロンブスのつみきシリーズはます。
var
o : TObject;
begin
TypeDict := TDictionary<String,TClass>.Create;
TypeDict.Add('integer',TList<integer>);
if TypeDict.ContainsKey('integer') then
o := TypeDict.Items['integer'].Create;
if Assigned(o) then
ShowMessage(o.ClassName);
end;
別の編集: 私は今までにないかと思われは昨夜、発見された別の技術で融合するこのコンセプト。インタフェースここには、迅速な例ですが延長:
TYPE
ITest = interface
['{0DD03794-6713-47A0-BBE5-58F4719F494E}']
end;
TIntfList<t> = class(TList<T>,ITest)
public
function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
o : TObject;
fTestIntf : ITest;
begin
TypeDict := TDictionary<String,TClass>.Create;
TypeDict.Add('integer',TIntfList<integer>);
if TypeDict.ContainsKey('integer') then
o := TypeDict.Items['integer'].Create;
if Assigned(o) and Supports(o,ITest,fTestIntf) then
ShowMessage(o.ClassName);
end;
のように実施のQueryInterface,_AddRefと_Release方法を伸ばしてインターフェースに何かをより便利です。
、「RegisterClass」機能が役立つだろう。しかし、それは、ジェネリックや基本的なタイプでは動作しません。