2017-07-03 4 views
2

私はORMを作成するためにDelphi-TokyoでRTTIを勉強していますが、オブジェクトでもあるプロパティにアクセスするのに問題があります。以下のコードで、idPropのキャストはどのように行うことができますか? TRttiPropertyインスタンス上オブジェクトのTRTTIPropertyのキャストを実行する方法

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, rtti, Vcl.StdCtrls; 

type 
    TIntField = class(TObject) 
    private 
    fDisplayNme: string; 
    public 
    constructor Create(DisplayName: string); 
    published 
    property DisplayName: string read fDisplayNme write fDisplayNme; 
    end; 

    TSale = class(TObject) 
    private 
    fIdSale: TIntField; 
    public 
    constructor Create; 
    published 
    property IdSale: TIntField read fIdSale write fIdSale; 
    end; 

    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 


{ TIntField } 

constructor TIntField.Create(DisplayName: string); 
begin 
    fDisplayNme:= DisplayName; 
end; 

{ TSale } 

constructor TSale.Create; 
begin 
    fIdSale:= TIntField.Create('idSale'); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Context: TRttiContext; 
    TypObj: TRttiType; 
    Prop: TRttiProperty; 
    sale: TSale; 
    id:  TIntField; 
begin 
    sale:= TSale.Create; 

    Context:= TRttiContext.Create; 

    TypObj:= Context.GetType(sale.ClassInfo); 

    prop:= TypObj.GetProperty('IdSale'); 

    id:= Prop as TIntField; //Would you like to do this or something equivalent 

    ShowMessage(id.DisplayName); 
end; 

end. 

答えて

2

コールGetValue、インスタンスのポインタを渡します。これによりTValueが生成され、そこからAsType<T>を使ってオブジェクトを抽出することができます。このように:

var 
    Context: TRttiContext; 
    Typ: TRttiType; 
    Prop: TRttiProperty; 
    sale: TSale; 
    id: TIntField; 
.... 
sale := TSale.Create; 
Typ := Context.GetType(sale.ClassInfo); 
Prop := Typ.GetProperty('IdSale'); 
id := Prop.GetValue(sale).AsType<TIntField>; 
Writeln(id.DisplayName); 
関連する問題