如何使用RTTI设置枚举字段的值? 即 type TCPIFileStatus= (fsUnknown, fsProcessed); TTest = class FStatus: TCPIFileStatus; end; ... var Data: TTest; Ctx: TRttiContext; Status : TCPIFileStatus; begin Data := TTest.Create; Status :
即
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.