2011-10-20 12 views
17

Delphi 2010'da RTTI sistemini kullanarak, bir mülkün bir TDateTime olup olmadığını öğrenmenin bir yolu var mı? Şu anda her ne zaman bir geri dönüş olarak çağırıyorsam, ve ben de mülk tipini kontrol edersem. Bu sadece taban tipini görebildiği için mi? (TDateTime = çift)TDateTime özelliklerini RTTI ile Double özelliklerinden nasıl ayırt edebilirim?

+0

Eh, bir tarih/saat daima çift kesir kısmı – Marco

+0

(bir gün bir parçası olarak) dakika ve saniye temsil ederken hangi tamsayı kısmı günleri temsil Bunun bir anlamak teknik olarak çifte, fakat TDTI'yi orijinal olarak – Barry

cevap

22

deneyin ben Delphi 2010 yok TRttiProperty.PropertyType

ait Name özelliğini kontrol, ancak bu XE çalışır. türünü tanımlayan tip yönergesi ise

{$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. 

bu kod burada

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

+1, şapka kapalı olarak tanımlı olup olmadığını kontrol etmek için kullanabileceğim herhangi bir yol var mı? Ben – TLama

+0

+1 imkansız olduğuna inanmadım, çok teşekkür ederim, yeniden kod yazmayı yeniden yazdım :) – Barry

+0

Size yardımcı olmaktan çok mutluyum :) – RRUZ

3

Anahtar noktayı döndürür. Bu iki tanım farklıdır:

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

Açıkçası OP, söz konusu türleri açıklamamıştı, bu yüzden teknik olarak bu bir cevap değil, fakat tam olarak haklısınız ve bu ek açıklama iyi bir bilgi olsa da. +1 – NGLN

İlgili konular