本文介绍了用于枚举的Delphi RTTI SetValue的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何使用RTTI设置枚举字段的值?
How do I use RTTI to set an enumerated field's value ?
即,
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,因为我不会总是在设计时知道对象类型或字段名。
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.
推荐答案
你必须通过到方法尝试使用此代码:
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.
这篇关于用于枚举的Delphi RTTI SetValue的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!