当前位置 : 主页 > 编程语言 > delphi >

用于枚举的Delphi RTTI SetValue

来源:互联网 收集:自由互联 发布时间:2021-06-23
如何使用RTTI设置枚举字段的值? 即 type TCPIFileStatus= (fsUnknown, fsProcessed); TTest = class FStatus: TCPIFileStatus; end; ... var Data: TTest; Ctx: TRttiContext; Status : TCPIFileStatus; begin Data := TTest.Create; Status :
如何使用RTTI设置枚举字段的值?

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;

我得到“无效的类类型转换”.
注意:我需要使用RTTI,因为在设计时我不会总是知道对象类型或字段名称.

您必须将 TValue传递给 SetValue方法尝试使用此代码:

{$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.
网友评论