2011-10-20 38 views
17

在Delphi 2010中使用RTTI系統,有沒有什麼辦法可以找出屬性是否是TDateTime?目前,當我將其作爲變量回撥並且如果檢查屬性類型時,它將其視爲雙倍數。這是由於它只能看到基本類型嗎? (TDateTime類型=雙)我如何區分TDateTime屬性和RTTI的Double屬性?

+0

好了,日期/時間始終是一個雙,其中整數部分代表天,而小數部分代表分和秒(如一日的一部分) – Marco

+0

我明白這是一個雙技術,但有什麼辦法我可以使用RTTI來檢查它是否定義爲TDateTime最初 – Barry

回答

22

嘗試檢查的TRttiProperty.PropertyType

Name財產我沒有德爾福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 
+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