How can I distinguish TDateTime properties from Double properties with RTTI?

前端 未结 2 1219
有刺的猬
有刺的猬 2021-02-18 19:03

Using the RTTI system in Delphi 2010, is there any way to find out if a property is a TDateTime? It\'s currently treating it as a double whenever I call back asVariant and also

相关标签:
2条回答
  • 2021-02-18 19:22

    Key point here while defining type is the type directive. These two definitions are different:

    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 讨论(0)
  • 2021-02-18 19:30

    Try checking the Name property of the TRttiProperty.PropertyType

    I don't have Delphi 2010, but this works in 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.
    

    this code returns

    the property Date1 is TDateTime
    the property Date2 is TDateTime
    
    0 讨论(0)
提交回复
热议问题