Search code examples
delphienumerationrtti

Delphi RTTI SetValue for Enumerations


How do I use RTTI to set an enumerated field's value ?

I.e.

type
  TCPIFileStatus= (fsUnknown, fsProcessed);
  TTest = class
    FStatus: TCPIFileStatus; 
  end;
      ...
  var
    Data: TTest;
    Ctx: TRttiContext;
    Status : TCPIFileStatus;
  begin
    Data := TTest.Create;
    Status := fsProcessed;
    Ctx.GetType(Data.ClassType).GetField('FStatus').SetValue(Data, Status);
  end;

I get "Invalid class typecast."
NB:I need to use RTTI because I will not always know the object type or field name at design time.


Solution

  • you must pass a TValue to the SetValue method try using this code :

    {$APPTYPE CONSOLE}
    uses
      Rtti,
      SysUtils;
    
    
    type
      TCPIFileStatus= (fsUnknown, fsProcessed);
      TTest = class
        FStatus: TCPIFileStatus;
      end;
    
      var
        Data   : TTest;
        Ctx    : TRttiContext;
        Status : TCPIFileStatus;
        v      : TValue;
    begin
      try
        Data := TTest.Create;
        try
          Status := fsProcessed;
          v:= v.From(status); 
          Ctx.GetType(Data.ClassType).GetField('FStatus').SetValue(Data, v);
    
          // do your stuff
        finally
           Data.Free;
        end;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.