2011-10-20 6 views
17

Delphi 2010에서 RTTI 시스템을 사용하면 속성이 TDateTime인지 확인할 수있는 방법이 있습니까? 현재 asVariant를 다시 호출 할 때마다 그리고 속성 유형을 확인하는 경우에도 double으로 처리합니다. 이것은 기본 유형 만 볼 수 있다는 사실 때문입니까? (TDateTime으로 = 더블)RTate를 사용하여 TDateTime 속성과 Double 속성을 구분할 수 있습니까?

+0

음, 날짜/시간은 항상 더블 소수 부분은 – Marco

+0

(하루의 일환으로) 분, 초를 나타내고있는 정수 부분은, 일을 대표하는 나는 그것이 이해 기술적으로 두 번이지만 RTTI를 사용하여 원래 TDateTime으로 정의되었는지 확인할 수 있습니다. – Barry

답변

22

시도 내가 델파이 2010이없는 TRttiProperty.PropertyType

Name 속성을 확인, 그러나 이것은 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 
+1

+1, 모자; 나는 그것이 가능하다고 믿지 않았다. – TLama

+0

+1 고맙다. 코드의 조각을 다시 써서 구해 주었다. – Barry

+0

다행이다. :) – RRUZ

3

요점을 반환합니다. 이 두 정의는 다르다 :

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

명백하게 OP는 문제의 유형을 선언하지 않았으므로 기술적으로 이것은 대답이 아니지만 귀하는 매우 옳았으며이 추가 설명은 좋은 정보입니다. +1 – NGLN