2017-07-03 6 views
2

Ich studiere RTTI in Delphi-Tokyo, um ein ORM zu erstellen, aber ich habe Probleme beim Zugriff auf Eigenschaften, die ebenfalls Objekte sind. In dem Code unten, wie kann ich die Besetzung der Prop für id durchführen?So führen Sie eine Umwandlung einer TRTTIProperty für ein Objekt durch

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. 

Antwort

2

GetValue Anruf auf der TRttiProperty Instanz, vorbei an den Instanz-Zeiger. Dies ergibt eine TValue, aus der Sie das Objekt mit AsType<T> extrahieren können. So:

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); 
Verwandte Themen