Как я могу отличить свойства TDateTime от свойств Double с помощью RTTI?

Есть ли способ узнать, является ли свойство TDateTime с помощью системы RTTI в Delphi 2010? В настоящее время он обрабатывает его как двойной всякий раз, когда я вызываю asVariant, а также если я проверяю тип свойства. Это связано с тем, что он может видеть только базовый тип? (TDateTime = двойной)


person Barry    schedule 20.10.2011    source источник
comment
Ну, дата/время всегда являются двойными, в которых целая часть представляет дни, а дробная часть представляет минуты и секунды (как часть дня)   -  person Marco    schedule 20.10.2011
comment
Я понимаю, что технически это двойной, но могу ли я использовать RTTI, чтобы проверить, изначально ли он определен как TDateTime?   -  person Barry    schedule 20.10.2011


Ответы (2)


Попробуйте проверить свойство Name элемента TRttiProperty.PropertyType.

У меня нет Delphi 2010, но это работает в 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.

этот код возвращает

the property Date1 is TDateTime
the property Date2 is TDateTime
person RRUZ    schedule 20.10.2011
comment
+1 большое спасибо, спас меня от повторного написания кода :) - person Barry; 20.10.2011
comment
Это также работает, по крайней мере, с Delphi 5 со старыми методами TypInfo. - person Ken Bourassa; 21.10.2011

Ключевым моментом здесь при определении типа является директива type. Эти два определения отличаются:

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 !
person Mehmet Fide    schedule 25.03.2012
comment
Очевидно, что OP не объявлял рассматриваемые типы, поэтому технически это не ответ, но вы совершенно правы, и это дополнительное объяснение является хорошей информацией. +1 - person NGLN; 26.03.2012