2011-10-20 35 views
17

Sử dụng hệ thống RTTI trong Delphi 2010, có cách nào để tìm hiểu xem thuộc tính có phải là TDateTime không? Nó hiện đang xử lý nó như là một đôi bất cứ khi nào tôi gọi lại asVariant và cũng có thể nếu tôi kiểm tra loại tài sản. Đây có phải là do thực tế nó chỉ có thể nhìn thấy loại cơ sở? (TDateTime = kép)Làm thế nào tôi có thể phân biệt các thuộc tính TDateTime từ các thuộc tính Đôi với RTTI?

+0

Vâng, một ngày/giờ luôn luôn là một đôi, trong đó một phần số nguyên đại diện cho ngày, trong khi phần thập phân đại diện cho phút và giây (như là một phần của một ngày) – Marco

+0

Tôi hiểu đó là một đôi về mặt kỹ thuật nhưng có cách nào tôi có thể sử dụng RTTI để kiểm tra nếu nó được định nghĩa là một TDateTime ban đầu – Barry

Trả lời

22

Hãy thử kiểm tra Name tài sản của TRttiProperty.PropertyType

Tôi không có Delphi năm 2010, nhưng công trình này trong 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. 

mã này trả về

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

+1, mũ tắt; Tôi không tin rằng nó có thể – TLama

+0

+1 cảm ơn bạn rất nhiều, đã cứu tôi viết lại một đoạn mã nhỏ :) – Barry

+0

Rất vui được giúp bạn :) – RRUZ

3

Điểm then chốt ở đây trong khi xác định loại là loại chỉ thị. Hai định nghĩa khác nhau:

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

Rõ ràng OP không khai báo các loại được đề cập, vì vậy về mặt kỹ thuật, đây không phải là câu trả lời, nhưng bạn hoàn toàn đúng và lời giải thích bổ sung này là thông tin tốt. +1 – NGLN

Các vấn đề liên quan