2011-10-20 16 views
17

Usando el sistema RTTI en Delphi 2010, ¿hay alguna forma de averiguar si una propiedad es un TDateTime? Actualmente lo estoy tratando como un doble cada vez que llamo como Variant y también si reviso el tipo de propiedad. ¿Esto se debe al hecho de que solo puede ver el tipo de base? (TDateTime = doble)¿Cómo puedo distinguir las propiedades de TDateTime de las propiedades dobles con RTTI?

+0

Bueno, una fecha/hora es siempre un doble en la que la parte entera representan días, mientras que parte fraccionaria representa minutos y segundos (como parte de un día) – Marco

+0

entiendo que es una doblemente técnico, pero ¿hay alguna manera en que pueda usar RTTI para verificar si está definido como un TDateTime originalmente – Barry

Respuesta

22

trate de comprobar la propiedad de la NameTRttiProperty.PropertyType

no tengo Delphi 2010, pero esto funciona en 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. 

este código devuelve

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

+1, sombreros desactivados? No creía que fuera posible – TLama

+0

+1 muchas gracias, me salvó la reescritura de un shedload de código :) – Barry

+0

Me complace ayudarte :) – RRUZ

3

punto clave aquí mientras se define un tipo es el tipo Directiva. Estas dos definiciones son diferentes:

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

Obviamente, OP no declaró los tipos en cuestión, por lo que técnicamente esto no es una respuesta, pero tiene toda la razón, aunque esta explicación adicional es buena. +1 – NGLN

Cuestiones relacionadas