2011-10-20 5 views
17

Utilizzando il sistema RTTI in Delphi 2010, c'è qualche modo per scoprire se una proprietà è un TDateTime? Attualmente lo tratta come un doppio ogni volta che richiamo come Variante e anche se controllo il tipo di proprietà. È dovuto al fatto che può vedere solo il tipo di base? (TDateTime = doppio)In che modo è possibile distinguere le proprietà TDateTime da Proprietà doppie con RTTI?

+0

Beh, una data/ora è sempre un doppio in cui la parte intera rappresentano giorni, mentre la parte frazionaria rappresenta minuti e secondi (come parte di un giorno) – Marco

+0

Capisco che è un doppio tecnicamente, ma c'è un modo per utilizzare RTTI per verificare se è definito come TDateTime in origine – Barry

risposta

22

Prova a controllare la proprietà Name del TRttiProperty.PropertyType

Non ho Delphi 2010, ma questo funziona in XE.

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Classes, 
    Rtti; 

type 
    TMyClass =class 
    private 
    FDate: TDateTime; 
    FProp: Integer; 
    FDate2: TDateTime; 
    FDate1: TDateTime; 
    public 
    property Date1 : TDateTime read FDate1 Write FDate1; 
    property Prop : Integer read FProp Write FProp; 
    property Date2 : TDateTime read FDate2 Write FDate2; 
    end; 

var 
ctx : TRttiContext; 
t : TRttiType; 
p : TRttiProperty; 
begin 
ctx := TRttiContext.Create; 
try 
    t := ctx.GetType(TMyClass.ClassInfo); 
    for p in t.GetProperties do 
    if CompareText('TDateTime',p.PropertyType.Name)=0 then 
    Writeln(Format('the property %s is %s',[p.Name,p.PropertyType.Name])); 
finally 
    ctx.Free; 
end; 
    Readln; 
end. 

questo codice restituisce

the property Date1 is TDateTime 
the property Date2 is TDateTime 
+1

+1, cappello spento; Io non credo che sia possibile – TLama

+0

+1 grazie così tanto, mi ha salvato riscrittura uno shedload di codice :) – Barry

+0

lieti di aiutarvi :) – RRUZ

3

punto chiave qui mentre il tipo che definisce è il tipo direttiva. Queste due definizioni sono diverse:

Type 
    TDateTime = Double; // here p.PropertyType.Name returns Double 

but 

Type 
    TDateTime = type Double; // here p.PropertyType.Name returns TDateTime 

or 

Type 
    u8 = type Byte; // here p.PropertyType.Name returns u8 

but 

Type 
    u8 = Byte; // here p.PropertyType.Name returns Byte ! 
+0

Ovviamente OP non ha dichiarato i tipi in questione, quindi tecnicamente questa non è una risposta, ma hai perfettamente ragione e questa spiegazione extra è comunque una buona informazione. +1 – NGLN