Delphi RTTI中如何使用SetValue进行属性值设置?
- 内容介绍
- 文章标签
- 相关推荐
本文共计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.

