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?
17
A
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
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
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
Capisco che è un doppio tecnicamente, ma c'è un modo per utilizzare RTTI per verificare se è definito come TDateTime in origine – Barry