Есть ли способ узнать, является ли свойство TDateTime с помощью системы RTTI в Delphi 2010? В настоящее время он обрабатывает его как двойной всякий раз, когда я вызываю asVariant, а также если я проверяю тип свойства. Это связано с тем, что он может видеть только базовый тип? (TDateTime = двойной)
Как я могу отличить свойства TDateTime от свойств Double с помощью RTTI?
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
+1 большое спасибо, спас меня от повторного написания кода :)
- person Barry; 20.10.2011
Это также работает, по крайней мере, с 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
Очевидно, что OP не объявлял рассматриваемые типы, поэтому технически это не ответ, но вы совершенно правы, и это дополнительное объяснение является хорошей информацией. +1
- person NGLN; 26.03.2012