質問

与えられた文字列を含むタイプの名前は一部の取得は、適切なタイプです。

私は見ていて思ったこと。

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」機能が役立つだろう。しかし、それは、ジェネリックや基本的なタイプでは動作しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top