Delphi RTTI中如何使用SetValue进行属性值设置?

更新于
2026-10-03 10:34:02
2阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计253个文字,预计阅读时间需要2分钟。

要简化这段代码并使其符合您的要求,可以去除注释和部分不必要的内容。以下是简化后的代码:

plaintexttype TCPIFileStatus=(fsUnknown, fsProcessed);TTest=class(FStatus: TCPIFileStatus);var Data: TTest; Ctx: TRttiContext; Status: TCPIFileStatus;begin Data :=TTest.Create; Status :='fsUnknown';end;

如何使用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.

本文共计253个文字,预计阅读时间需要2分钟。

要简化这段代码并使其符合您的要求,可以去除注释和部分不必要的内容。以下是简化后的代码:

plaintexttype TCPIFileStatus=(fsUnknown, fsProcessed);TTest=class(FStatus: TCPIFileStatus);var Data: TTest; Ctx: TRttiContext; Status: TCPIFileStatus;begin Data :=TTest.Create; Status :='fsUnknown';end;

如何使用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.